原码、反码和补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。
符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。
原码:就是其二进制表示(最高位是符号位)。
00 00 00 11 -> 3
10 00 00 11 -> -3
反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
00 00 00 11 -> 3
11 11 11 00 -> -3
补码:正数的补码就是原码,负数的补码是反码+1。
00 00 00 11 -> 3
11 11 11 01 -> -3
按位非操作 ~
~把num 的补码中的0和1全部取反(0变为1,1变为0)有符号整数的符号位在~运算中同样会取反
~ 1 = 0
~ 0 = 1
按位与操作 &
只有两个对应位为1时才为1
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
按位或操作 |
只要两个对应位有一个1就为1
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
按位异或操作 ^
只有两个对应位不同时才为1
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
A:00 00 11 00
B:00 00 01 11
A ^ A = 00 00 00 00
A ^ 0 = 00 00 11 00
A ^ A ^ B = 00 00 01 11
按位左移 <<
num << i 将num的二进制表示向左移动 i 位所得的值。
00 00 10 11 -> 11
11 << 3
------------------
01 01 10 00 -> 88
按位右移 >>
num >> i 将num的二进制表示向右移动 i 位所得的值。
00 00 10 11 -> 11
11 >> 2
------------------
00 00 00 10 -> 2
本文章主要内容摘自阿里云天池leetcode训练营,主要当作笔记记录,如有错误的地方或者有没写完的地方,请见谅。