位运算可对变量中的个别位进行操作,您可能对这样做的原因感到奇怪,这种能力有时确实是必须的,或者至少是有用的。
位运算符可以分为两大类:1、位逻辑运算符;2、移位运算符
1、位逻辑运算符:
位运算符用于整型数据,包括char。讲这些位运算符作为位运算的的原因是:他们对每位进行操作而不影响左右两位的值。注意:请不要将位逻辑运算符与常规的逻辑运算符(&&、||、!)混用,常规的逻辑运算符是对整个值进行操作。
按位取反(~):是一元运算符,是将每个0变为1,将每个1变为0,如下例子:
int a=7
a=0000 0111
int b=~a;//进行按位取反得到的是这个数的原码,在计算机中数值一律由补码进行存储
b=1111 1000 //原码
1000 0111//反码
1000 1000//补码=-8
对b的原码进行反码、补码操作后,可得到b=-8;
原码如何转换成反码、补码(这里对原码、反码、补码进行详细讲解)
运行结果:
位与(&):二元运算符,通过对两个操作数逐位进行比较产生一个新值;对于每个位,只有两个操作数的对应为都为1时结果才为1,否则为0。
int a=7;
a=0000 0111
int b=12;
b=0000 1100
int c=a&b;
c=0000 0100;//c=4
运行结果:
![]()
位或(|):二元运算符,通过对两个操作数逐一进行比较产生一个新值;对于每个位,只要有一个操作数的位是1,结果就是1,否者为0。
int a=7;
a=0000 0111
int b=12;
b=0000 1100
int c=a|b;
c=0000 1111;//c=15
运行结果:
![]()
位异或(^):二元运算符^,通过对两个逐位进行比较产生一个新值;如果操作数中的对应位有一个是1时那么结果为1,否则为0(两个0,两个1);
int a=7;
a=0000 0111
int b=12;
b=0000 1100
int c=a^b;
c=0000 1011;//c=11
运行结果:
![]()
2、移位运算符:
以为运算符将位向左或向右移动,同样我们仍将用二进制的形式来说明该机制的工作原理。
左移(<<):
左移运算符<<将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数决定。空出来的位用0填充,并且丢弃移出左侧操作数末端的位。
int a=1;
a=0000 0001
b=a<<1;//使a向左移一位
b=0000 0010//b=2
总结:左移一位相当于原来的乘2
运行结果:
![]()
右移(>>):
右移操作符>>将其右侧操作数的值的每位向右移动,移动的位数由其右侧操作数决定。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器,空出的位可能用0填充,或者使用符号位(最左端)的副本填充。
int a=2;
a=0000 0010
int b=a>>1;//使a向左移一位
b=0000 0001//b=1;
总结:右移一位相当于原来的值除以2;
运行结果:
![]()
移位运算符的优点:能够提供快捷、高效对2的幂的乘法和除法;
number << n | number乘以2的n次幂 |
number >> n | 如果number非负,则用number除以2的n次幂 |