程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作。
知识点:
1、补码:用于将十进制的负整数转换为二进制数。十进制的正整数可以除以2取余,负整数则需要补码。
补码的流程:例如-10
10:0000 0000 0000 1010
取反:1111 1111 1111 0101
+1
-10:1111 1111 1111 0110
2、负数在内存中以补码存在。
一、按位与(&)
定义:如果两个相应的二进制位都为1,则该位的结果值为1,否则为0.
示例:
1、10与-10 &运算
10:0000 0000 0000 1010 -----> 十进制转二进制
-10:1111 1111 1111 0110 -----> -10就是10取反,然后+1(补码)
结果: 0000 0000 0000 0010 -----> 结果为2
二、按位或(|)
定义:如果两个相应的二进制位有一个为1,则该结果为1,否则为0.
示例:
1、10与-10 |运算
10:0000 0000 0000 1010
-10:1111 1111 1111 0110
结果: 1111 1111 1111 1110 ----->结果-2
第一位为符号位,1代表是负数,因此是补码形式存在,补码-->十进制。先取反(符号位不变),+1。
1000 0000 0000 0001
+1
1000 0000 0000 0010 ------> -2
三、按位异或(^)
定义:如果两个相应的二进制位值不同则为1,否则为0
示例:
1、10与-10 ^运算
10:0000 0000 0000 1010
-10:1111 1111 1111 0110
结果: 1111 1111 1111 1100 ------> 结果-4
四、取反(~)
定义:用来对一个二进制按位取反。
示例:
1、10取反
10:0000 0000 0000 1010
结果: 1111 1111 1111 0101 ------> 结果-11
五、左移(<<)
定义:将一个数的各二进制位全部左移N位,右补0
示例:
1、10左移<<2
10:0000 0000 0000 1010
结果: 0000 0000 0010 1000------> 结果40
六、右移(>>)
定义:将一个数的各二进制位全部右移N位,移到右边的低位被舍弃,对于无符号数高位补0,负数高位补1.
1、10右移>>2
10:0000 0000 0000 1010
结果: 0000 0000 0000 0010------> 结果2
2、-10右移>>2
-10:1111 1111 1111 0110
结果: 1111 1111 1111 1101
取反,符号位不变
1000 0000 0000 0010
+1
1000 0000 0000 0011
结果:-3
七、>>>(无符号右移)
定义:将一个数的各二进制位全部右移N位,移到右边的低位被舍弃,对于无符号数高位补0,只是对32位和64位的值有意义。
示例:
1、-10>>>2
-10:1111 1111 1111 1111 1111 1111 1111 0110 ------->由于>>>只对32和64位有意义,所以把-10定义成32位的
结果: 0011 1111 1111 1111 1111 1111 1111 1101
取反(符号位不变)
0100 0000 0000 0000 0000 0000 0000 0010
+1
0100 0000 0000 0000 0000 0000 0000 0011
位运算------按位与、按位或、按位异或、取反、<<、>>、>>>
原文:https://www.cnblogs.com/alimayun/p/10693358.html