C语言的六种位运算符&,|,^,~,<<,>>,>>>
&按位与
举例:
010101
100101
------
000101
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。
|按位或
举例:
010101
100101
------
110101
只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
^按位异或
举例:
010101
100101
------
110000
参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现
~取反
举例:
010101 ~后
------
101010
<<左移
举例:
12<<3
------
12*2^3
<<=
举例:
a<<=n
等价a=a<<n
-----
a=a*2^n
>>右移
举例:
12>>3
------
12/2^3
>>>无符号右移
举例:
11111111 11111111 11111001
------
00111111 11111111 11111110
右移2位,最后2位舍去,前面补0
负数的表示方式
0000 0001(1的源码)
1000 0001(1的源码最高位设置为1表示负数)
1111 1110(高位不动,再取反后的结果)
1111 1111 (然后在+1表示补码:最后得到-1的源码)
所以-1的二进制:1111 1111
总结:正数的源码高位设置为1,除高位外,其他位取反,然后+1(补码),最后得到此正数的二进制负数
1111 1000(-1左移3位)
0001(1)1\*2^0=1\*1 = 1
0010(1+1=2)(1\*2^1)+(0\*2^0) = 2+0 = 2
0011(1+1+1=3)(1\*2^1)+(1\*2^0) = 2+1 = 3