原码、补码、反码
- 正数内存中以原码存在,正数原码 = 补码 = 反码
// +5 整型 4 字节
原码 : 0000 0000 0000 0000 0000 0000 0000 0101
补码 : 0000 0000 0000 0000 0000 0000 0000 0101
反码 : 0000 0000 0000 0000 0000 0000 0000 0101
- 负数以补码形式存在;
// -5
原码 :1000 0000 0000 0000 0000 0000 0000 0101
反码 :1111 1111 1111 1111 1111 1111 1111 1010 (反码取反的时候除符号位)
补码 :1111 1111 1111 1111 1111 1111 1111 1011 ff ff ff fb
与或运算
- -5 &10 & 两个都为1才为1
// -5
原码 :1000 0000 0000 0000 0000 0000 0000 0101
反码 :1111 1111 1111 1111 1111 1111 1111 1010
补码 :1111 1111 1111 1111 1111 1111 1111 1011
// 10
原码 :0000 0000 0000 0000 0000 0000 0000 1010
反码 :1111 1111 1111 1111 1111 1111 1111 1010
补码 :1111 1111 1111 1111 1111 1111 1111 1010
// -5 & 10
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 1010
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010 // 1010 10即a
- -5 | 10 只要有一个1,就为1
// -5 | 10
1111 1111 1111 1111 1111 1111 1111 1011
0000 0000 0000 0000 0000 0000 0000 1010
-----------------------------------------
1111 1111 1111 1111 1111 1111 1111 1011 // ff ff ff fb 11
符号位会按位运算
-5 取反
0000 0000 0000 0000 0000 0000 0000 0100 ~(-5) 等于4
异或
不同得1,相同得0
1001 1100
0101 1010
---------
1100 0110
移位
-
右移 << 左移
右移分逻辑右移 算术右移 左移没有划分
(1)右移
逻辑右移 高位补0 低位溢出
0101 1010 >> 3
----------------
0000 1011
算术右移 高位补符号位 低位溢出 (有符号数补1)
1010 1101 >> 3
--------------
1111 0101
0101 0011 >> 3 无符号来说 补0
---------
0000 1010
逻辑右移还是算术右移,取决于编译器;