今天在刷 LeetCode 算法题时遇到了一个用异或解决的题,自己也不是特别熟悉那几个运算符,所以尝试并记录一下
原码、反码,补码解释
- 对于有符号的数而言,最高位为符号位,0 表示正数,1 是表示负数
例如:1 的有符号二进制值为 00000001,-1 的有符号二进制值为 10000001 - 正数的原码、反码、补码都一样
例如:1 的原码为 00000001,反码也为 00000001,补码也为 00000001 - 负数的反码为符号位不变,其他位取反,补码为反码+1
例如:-1 的原码为 10000001,反码为 11111110,补码为 11111111 - 0 的反码、补码都为 0
- 在计算机运行时,都是以补码的方式来运算的,但是在我们看的时候看到的是原码
一、按位与(&)
相同的位数上的数,都是 1 的时候就是 1,否则就为 0
- 举例说明:2&3
运算方法:2 的补码为 00000010,3 的补码为 00000011
只有倒数第二位都是 1,所以 2&3 的补码就是 00000010,正数原码补码相同,转换为 10 进制值就是 2 - 举例说明:3&4
运算方法:3 的补码为 00000011,4 的补码为 00000100
没有相同位数都是 1 的,所以 3&4 的补码就是 00000000,正数原码补码相同,转换为 10 进制值就是 0 - 举例说明:4&5
运算方法:4 的补码为 00000100,5 的补码为 00000101
只有倒数第三位都是 1,所以 4&5 的补码就是 00000100,正数原码补码相同,转换为 10 进制值就是 4 - 举例说明:-2&2
运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
只有倒数第二位都是 1,所以-2&2 的补码就是 00000010,正数原码补码相同,所以最终结果就是 00000010 转为 10 进制值为 2
二、按位或(|)运算符
相同的位数上的数,至少有一个是 1 的时候就是 1,否则就是 0
- 举例说明:2|3
运算方法:2 的补码为 00000010,3 的补码为 00000011
倒数第一、二位都是 1,所以 2|3 的补码就是 00000011,正数原码补码相同,转换为 10 进制值就是 3 - 举例说明:3|4
运算方法:3 的补码为 00000011,4 的补码为 00000100
倒数第一、二、三位都是 1,所以 3|4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7 - 举例说明:4|5
运算方法:4 的补码为 00000100,5 的补码为 00000101
倒数第一、三位都是 1,所以 4|5 的补码就是 00000101,正数原码补码相同,转换为 10 进制值就是 5 - 举例说明:-2|2
运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
只有倒数第一位是 0,所以-2&2 的补码就是 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2
三、按位异或(^)运算符
相同的位数上的数,相同就是 0,不同就是 1
- 举例说明:2^3
运算方法:2 的补码为 00000010,3 的补码为 00000011
只有倒数第一位不同,所以 2^3 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1 - 举例说明:3^4
运算方法:3 的补码为 00000011,4 的补码为 00000100
倒数第一、二、三位都不同,所以 3^4 的补码就是 00000111,正数原码补码相同,转换为 10 进制值就是 7 - 举例说明:4^5
运算方法:4 的补码为 00000100,5 的补码为 00000101
只有倒数第一位不同,所以 4^5 的补码就是 00000001,正数原码补码相同,转换为 10 进制值就是 1 - 举例说明:-2^2
运算方法:-2 原码为 10000010,反码为 11111101,补码为 11111110,2 的补码为 00000010
只有后两位相同,所以-2&2 的补码就是 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4
四、左移(<<)运算符
所有位上的值向左移,符号位不变,溢出补 0
- 举例说明:3<<1
运算方法:3 的补码为 00000011,向左移 1 位后的补码是 00000110,正数原码补码相同,转换为 10 进制值就是 6 - 举例说明:3<<2
运算方法:3 的补码为 00000011,向左移 2 位后的补码是 00001100,正数原码补码相同,转换为 10 进制值就是 12 - 举例说明:3<<3
运算方法:3 的补码为 00000011,向左移 3 位后的补码是 00011000,正数原码补码相同,转换为 10 进制值就是 24 - 举例说明:-3<<3
运算方法:-3 原码为 10000011,反码为 11111100,补码为 11111101,向左移 3 位后补码是 11101000,反码为 11100111,原码为 10011000,所以最终结果就是 10011000 转为 10 进制为-24
五、右移(>>)运算符
所有位上的值向右移,符号位不变,溢出补符号位的值
- 举例说明:7>>1
运算方法:7 的补码为 00000111,向右移 1 位后的补码是 00000011,正数原码补码相同,转换为 10 进制值就是 3 - 举例说明:7>>2
运算方法:7 的补码为 00000111,向右移 2 位后的补码是 00000001,正数原码补码相同,转换为 10 进制值就是 1 - 举例说明:7>>3
运算方法:7 的补码为 00000111,向右移 3 位后的补码是 00000000,正数原码补码相同,转换为 10 进制值就是 0 - 举例说明:-7>>3
运算方法:-7 的原码为 10000111,反码为 11111000,补码为 11111001,向右移 3 位后补码是 11111111,反码为 11111110,原码为 10000001,所以最终结果就是 10000001 转为 10 进制为-1
六、否(~)
所有位上的值变为相反的数,0 变为 1,1 变为 0
- 举例说明:~1
运算方法:1 的补码为 00000001,所以~1 的补码为 11111110,反码为 11111101,原码为 10000010,所以最终结果就是 10000010 转为 10 进制为-2 - 举例说明:~2
运算方法:2 的补码为 00000010,所以~2 的补码为 11111101,反码为 11111100,原码为 10000011,所以最终结果就是 10000011 转为 10 进制为-3 - 举例说明:~3
运算方法:3 的补码为 00000011,所以~3 的补码为 11111100,反码为 11111011,原码为 10000100,所以最终结果就是 10000100 转为 10 进制为-4 - 举例说明:~-3
运算方法:-3 的原码为 10000011,反码为 11111100,补码为 11111101,所以~-3 的补码为 00000010,正数原码补码相同,转换为 10 进制为 2