二进制位运算

508 阅读4分钟

二进制与十进制的转换

10进制转2进制

正数

正数的10进制转2进制,除2曲玉,从上到下为高位到低位,可以参考上边的真草图😅

负数

以-7为例 1、首先把负数的绝对值转为二进制 [-7] -> 7 - > 0111
2、对上一步得到的二进制按位取反~ -> 1000
3、对上一步得到的二进制+1 -> 1001

即 -7 = 1001

再以-3为例:

-3 -> |-3| -> 3 -> 0011 -> 1100 -> 1101

-4:
-4 -> |-4| -> 4 -> 0100 -> 1011 -> 1100

2进制转10进制

正数

按权相加

例如:
4位二进制,0011 -> 1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 = 1+2+0+0 = 3
4位二进制,0101 -> 1*2^0 + 0*2^1 + 1*2^1 + 0*2^3 = 1+0+4 = 5

负数

我们以10进制转2进制得到的结果为例\

-7 = 1001

1、首先对负数的2进制取反 1001 取反 得到 0110 2、取反的二进制转为10进制 得到6 3、得到的十进制+1,然后加上符号得到结果 即 -(6+1) = -7

-3 = 1101

1、负数的二进制取反 1101取反得到0010
2、取反的二进制转10进制 0010->2 3、打到的10进制+1,加符号 -(2+1)=-3

按位与 &

描述

二进制下,相对应位都是1,则结果为1,否则为0

例如: 3&1 -> 011 & 001 -> 001 = 1

应用实例

判断整数n的奇偶性,n&1 == 1 ? 奇数 : 偶数

奇数的二进制的首位为1而偶数为0,1的非首位皆为0,n&1后,非首位皆为0
n&1,若n为基数则首位为1,非首位皆为0,即十进制为1,偶数则全为0,即十进制为0

按位或 |

描述

二进制下,如果相对应位都是 0,则结果为 0,否则为 1

例如:3|1 -> 011 | 001 -> 011 = 3

应用实例

获取大于当前值的最小整数,例如:3-4, 4-6, (n|1)+1

1的非首位皆为0,n|1后,n的非首位皆会保持原值,而首位时终为1,
奇数的首位本身即为1,即奇数|1结果保持不变,+1后为大于该奇数的偶数
偶数的首位本身为0,即偶数|1结果会比原值>1,+1后为大于该偶数的偶数

按位异或 ^

描述

二进制下,如果相对应位不通,则结果为 1,否则为0

例如:3|1 -> 011 ^ 001 -> 010 = 2

应用实例

加密解密: 原值val,密钥s 则 val^s = r => r^s = val

按位取反 ~

描述

按位取反运算符翻转操作数的每一位,即0变成1,1变成0,符号位也取反

例如 ~3 -> ~0011 -> 1100 转为10进制(最高位是1代表负数,负数转10进制,先取反,然后得到10进制的值+1,再加负号)
即 1100 -> 0011 -> 3+1 > 4 -> -4
即 ~3 对于的2进制位1100 对应的10进制为 -4

左移 <<

左移保持符号位,即正负号不变,左移N位相当于 原值乘以2的n次方

例如:3<<2 -> 0011 -> 1100 = 12

右移 >>

右移后,负数高位补1 正数高位补0,右移N位相当于原值除以2的n次方

示例(共4位):

4>>1 -> 0100 -> 右移后为 010 高位为0,补零后 0010 = 2

3>>1 -> 0011 -> 右移后为 1 高位为0,补零后 0001 = 1

-4>>1 -> 1100 -> 右移后为 10 高位为1,补1后 1110 = -2

-3>>1 -> 1101 -> 右移后位 10 高位为1, 补1后 1110 = -2

无符号右移

连同高位符号位右移,右移后,高位补0,正数无符号右移同右移,负数无符号右移往往会得到一个大的正数

示例(共4位):

4>>>1 -> 0100 -> 右移后为010 高位补零后 0010 = 2

-4>>>1 -> 1100 -> 右移后为110 高位补零后 0110 = 6