参考资料:https://juejin.im/post/5c530559f265da2d9617e1af
一.二进制
原码:
- 一个正数,按照绝对值大小转换成的二进制数;
- 一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码
- 比如 10000000 00000000 00000000 00000101 是 -5的 原码。
反码:
- 正数的反码与原码相同
- 负数的反码为对该数的原码除符号位外各位取反。
- 比如:负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。称互为反码。
补码:
- 正数的补码与原码相同
- 负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1
- 比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
补码为:11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
二.负数二进制
- 负数的二进制:正数取反加1
- 1字节(byte)范围:8位,一共表示256个数字。无符号:0 ~ 256,有符号:-128 ~ 127
- 0 ~ 127对应着7位。剩下1位代表负数标记
三.C++运算符
- 移位运算
- <<= 相当于乘2的n次方
- >>= 相当于除2的n次方
- OR(|)运算符
- 两个值对应位至少有1个为1,则新生值为1,否则为0:
- a |= b;
- 用来避免多次使用 if 三目运算符
- XOR(^)运算符
- 如果原始值对应位有一个为1,则新生值位位1,如果对应位都为0或1,则新生值位为0
- a ^= b;
- AND(&)
- 如果原始值对应位都为1,则新值对应位为1,否则为0
- a &= b;
四.运算符运用:
- b & 1:b如果是奇数,返回1,偶数返回0
- a&(a-1):掉a右边1
如a=10,则a&(a-1)= 10&9 = 1010&1001 = 1000 = 8。
网友评论