位运算的基本认识

位运算的基本认识

在$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 $运算构成成对变换的关系

posted @ 2020-10-03 15:53  yikanji  阅读(410)  评论(0)    收藏  举报