[LeetCode训练营]位运算

原码、反码和补码

二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。

符号位:最高位为符号位,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训练营,主要当作笔记记录,如有错误的地方或者有没写完的地方,请见谅。

猜你喜欢

转载自blog.csdn.net/qq_45415920/article/details/123140664