当你的才华还支撑不起你的野心的时候,你就应该停下来学习。
今天我们来了解一下位运算,可以说在所有的编程的中都有位运算。那么,位运算是怎么计算的呢?下面我就来详细介绍一下。注意:以下例子以java语言为参照。
位与(and)运算 &
计算规则:假设有两个数a和b,将它们分别转换成二进制。然后两个数对应的二进制数位中都为1结果就为1,如果其中一个数为0或者两个数都为0,则结果为0。
举个例子:
int a=6;
int b=3;
int c=a&b;
c的值为多少呢?
很简单我们来计算一下(这里我们采用4位来计算,实际计算机中是采用8位):
按照什么的图片中进行位与操作之后那么c的值为0010,所对应的十进制就是整数2。
我们来看一下,上面是怎么得出二进制0010的。
首先,我们看a和b所对应的二进制:
(1)在第四位中:a的二进制为0,b的为1。因为两个值其中有一个为0,一个为1,所以第四位的结果为0。
(2)在第三位中:a的二进制为1,b的为1。因为两个两个值都为1。所以第三位的结果位1。
(3)在第二位中:a的二进制为1,b的为0。因为两个值其中有一个为1,一个为0,所以第二位的结果为0。
(4)在第一位中:a的二进制为0,b的为0。因为两个值其中有一个为0,一个为0,所以第一位的结果为0。
(5)将四位数按位数顺序拼接起来,结果就为:0010。也就对应十进制数的数字2。
位或(or)运算 |
计算规则:假设有两个数a和b,将它们分别转换成二进制。然后两个数对应的二进制数位中其中一个为1结果就为1;如果两个数都为0,则结果为0;如果两个都为1,结果也为1。
举个例子:
int a=6;
int b=3;
int c=a|b;
这里就不画图演示了。计算的顺序和位与运算的顺序是一样的,只是规则不同。
a :0110
b :0011
所以c的结果为:
c :0111
c所对应的是十进制数位:7
异或(Xor)运算 ^
计算规则:假设有两个数a和b,将它们分别转换成二进制。然后两个数对应的二进制数位中相同则为0,不同则为1。
举个例子:
int a=6;
int b=3;
int c=a^b;
这里同样不画图了。直接推算一下:
a :0110
b :0011
所以c的结果为:
c :0101
c所对应的是十进制数位:5
按位取反运算 ~
这个就有点特殊了,涉及到源码,反码,补码
计算规则:①:正数的三个码都一致。正数的按位取反等于这个正数所对应的负数的二进制加1。
②:负数的源码等于所对应的正数的源码,最高为变为1。反码等于除符号位外负数的源码取反。补码等于负数的反码加1。负数的按位取反就等于补码取反。
举个例子(正数):
int a=6;
int b=~a;
这里就要用八位计算了,直接推算一下:
a :0000 0110 //源码
a :0000 0110 //反码
a :0000 0110 //补码
a :1000 0110 //变负数,-6
a :1000 0111 //按位取反后的值=变负数的源码+1
c所对应的是十进制数位:-7
举个例子(负数):
int a=-6;
int b=~a;
直接推算一下:
a :1000 0110 //源码
a :1111 1001 //反码=源码取反(除去符号位)
a :1111 1010 //补码=反码+1
a :0000 0101 //按位取反=补码取反
b :0000 0101
b所对应的是十进制数位:5
以上就是对位运算的介绍了,希望对你有所帮助。