位运算的基本认识
位运算的基本认识
在$m$位二进制数中, 通常称最低位为第$0$位, 从右到左依次类推, 最高位为第$m - 1$位
4种基本位运算
| 与 | 或 | 非 | 异或 |
| and, & | or, | | not, ~ | xor, ^ |
补码
32位无符号整数 unsigned int:
直接把这32位编码看作32位二进制数N
32位有符号整数 int:
以最高位为符号位, 0表示非负数, 1表示负数
对于最高位为0(非负数)的编码$ C $, 直接看作32位二进制数$ S $
定义该编码按位取反后得到的编码 $ \sim C $表示的数值为 $ -1-S $(即负数为正数取反后加一)
在补码下每个数值都有唯一的表示, 任意两个数值做加减法运算, 都等价于做加法(减法变加法)
32位无符号整数相当于自动对$ 2^{32} $取模, 而32位有符号整数算术上溢时可能出现负数
几个16进制数
| 16进制 | 10进制 | 32位补码 | 用处 |
| 0x3F 3F 3F 3F | 1061 109 567 | 0011 1111(重复4次) | 两数和不爆int的最大值 |
| 0x7F 7F 7F 7F | 2139 062 143 | 0111 1111(重复4次) | memset能初始化的int的最大值 |
| 0xFF FF FF FF | 2147 483 647 | 0111 1111(往后都是1) | int的最大值 |
位移运算
左移
二进制下把数字同时向左移动, 低位用$0$填充, 高位越界后舍弃
$ 1 << n = 2^{n} $, $ n << 1 = 2n $
算术右移
在二进制补码下把数字同时向右移动一位, 高位以符号位填充, 低位越界后舍弃
$ n >> 1 = \left \lfloor \frac{n}{2.0} \right \rfloor $ (相当于除以2后向下取整, 而int直接除以2向0取整)
运算符优先级从高到低排列顺序
| 加减 | 移位 | 比较大小 | 按位与 | 异或 | 按位或 |
| +, - | <<, >> | >, <, ==, != | & | xor, ^ | | |
特别注意 3个位运算的优先级低于比较大小的优先级
成对变换
对于非负整数n:
当 $ n $ 为偶数时, $ n\;xor\;1 == n + 1 $最低位0取反成1
当 $ n $ 为奇数时, $ n\;xor\;1 == n - 1 $最低位1取反成0
因此, "$0$ 和 $1$", "$2$ 和 $3$", ..., "$2n$ 和 $2n+1$"关于$ n\;xor\;1 $运算构成成对变换的关系

浙公网安备 33010602011771号