位运算符运算详解

237 阅读7分钟

今天在刷 LeetCode 算法题时遇到了一个用异或解决的题,自己也不是特别熟悉那几个运算符,所以尝试并记录一下

原码、反码,补码解释

  1. 对于有符号的数而言,最高位为符号位,0 表示正数,1 是表示负数 例如:1 的有符号二进制值为 00000001,-1 的有符号二进制值为 10000001
  2. 正数的原码、反码、补码都一样 例如:1 的原码为 00000001,反码也为 00000001,补码也为 00000001
  3. 负数的反码为符号位不变,其他位取反,补码为反码+1 例如:-1 的原码为 10000001,反码为 11111110,补码为 11111111
  4. 0 的反码、补码都为 0
  5. 在计算机运行时,都是以补码的方式来运算的,但是在我们看的时候看到的是原码

一、按位与(&)

相同的位数上的数,都是 1 的时候就是 1,否则就为 0

  1. 举例说明:2&3 运算方法:2 的补码为 00000010,3 的补码为 00000011 只有倒数第二位都是 1,所以 2&3 的补码就是 00000010,正数原码补码相同,转换为 10 进制值就是 2
  2. 举例说明:3&4 运算方法:3 的补码为 00000011,4 的补码为 00000100 没有相同位数都是 1 的,所以 3&4 的补码就是 00000000,正数原码补码相同,转换为 10 进制值就是 0
  3. 举例说明:4&5 运算方法:4 的补码为 00000100,5 的补码为 00000101 只有倒数第三位都是 1,所以 4&5 的补码就是 00000100,正数原码补码相同,转换为 10 进制值就是 4
  4. 举例说明:-2&2 运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010 只有倒数第二位都是 1,所以-2&2 的补码就是 00000010,正数原码补码相同,所以最终结果就是 00000010 转为 10 进制值为 2 按位与执行结果

二、按位或(|)运算符

相同的位数上的数,至少有一个是 1 的时候就是 1,否则就是 0

  1. 举例说明:2|3 运算方法:2 的补码为 00000010,3 的补码为 00000011 倒数第一、二位都是 1,所以 2|3 的补码就是 00000011,正数原码补码相同,转换为 10 进制值就是 3
  2. 举例说明:3|4 运算方法:3 的补码为 00000011,4 的补码为 00000100 倒数第一、二、三位都是 1,所以 3|4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7
  3. 举例说明:4|5 运算方法:4 的补码为 00000100,5 的补码为 00000101 倒数第一、三位都是 1,所以 4|5 的补码就是 00000101,正数原码补码相同,转换为 10 进制值就是 5
  4. 举例说明:-2|2 运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010 只有倒数第一位是 0,所以-2&2 的补码就是 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2 按位或执行结果

三、按位异或(^)运算符

相同的位数上的数,相同就是 0,不同就是 1

  1. 举例说明:2^3 运算方法:2 的补码为 00000010,3 的补码为 00000011 只有倒数第一位不同,所以 2^3 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  2. 举例说明:3^4 运算方法:3 的补码为 00000011,4 的补码为 00000100 倒数第一、二、三位都不同,所以 3^4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7
  3. 举例说明:4^5 运算方法:4 的补码为 00000100,5 的补码为 00000101 只有倒数第一位不同,所以 4^5 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  4. 举例说明:-2^2 运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010 只有后两位相同,所以-2&2 的补码就是 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4 按位异或执行结果

四、左移(<<)运算符

所有位上的值向左移,符号位不变,溢出补 0

  1. 举例说明:3<<1 运算方法:3 的补码为 00000011,向左移 1 位后的补码是 00000110,正数原码补码相同,转换为 10 进制值就是 6
  2. 举例说明:3<<2 运算方法:3 的补码为 00000011,向左移 2 位后的补码是 00001100,正数原码补码相同,转换为 10 进制值就是 12
  3. 举例说明:3<<3 运算方法:3 的补码为 00000011,向左移 3 位后的补码是 00011000,正数原码补码相同,转换为 10 进制值就是 24
  4. 举例说明:-3<<3 运算方法:-3 原码为 10000011,反码为 11111100,补码为 11111101,向左移 3 位后补码是 11101000,反码为 11100111,原码为 10011000,所以最终结果就是 10011000 转为 10 进制为-24 左移执行结果

五、右移(>>)运算符

所有位上的值向右移,符号位不变,溢出补符号位的值

  1. 举例说明:7>>1 运算方法:7 的补码为 00000111,向右移 1 位后的补码是 00000011,正数原码补码相同,转换为 10 进制值就是 3
  2. 举例说明:7>>2 运算方法:7 的补码为 00000111,向右移 2 位后的补码是 00000001,正数原码补码相同,转换为 10 进制值就是 1
  3. 举例说明:7>>3 运算方法:7 的补码为 00000111,向右移 3 位后的补码是 00000000,正数原码补码相同,转换为 10 进制值就是 0
  4. 举例说明:-7>>3 运算方法:-7 的原码为 10000111,反码为 11111000,补码为 11111001,向右移 3 位后补码是 11111111,反码为 11111110,原码为 10000001,所以最终结果就是 10000001 转为 10 进制为-1 右移执行结果

六、否(~)

所有位上的值变为相反的数,0 变为 1,1 变为 0

  1. 举例说明:~1 运算方法:1 的补码为 00000001,所以~1 的补码为 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2
  2. 举例说明:~2 运算方法:2 的补码为 00000010,所以~2 的补码为 11111101,反码为 11111100,原码为 10000011,所以最终结果就是 10000011 转为 10 进制为-3
  3. 举例说明:~3 运算方法:3 的补码为 00000011,所以~3 的补码为 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4
  4. 举例说明:~-3 运算方法:-3 的原码为 10000011,反码为 11111100,补码为 11111101,所以~-3 的补码为 00000010,正数原码补码相同,转换为 10 进制为 2 否执行结果