一、进制转换
1、十进制转二进制
如十进制34转为二进制:
34/2=17······0
17/2=8·······1
8/2=4········0
4/2=2········0
2/2=1········0
1/2=0········1
得到34二进制:0010 0010
2、十进制转八进制(同上)
3、二进制转八进制
从低位开始,将二进制数每三位一组,转成对应八进制数
4、二进制转十六进制
从低位开始,将二进制数每四位一组,转成对应十六进制数
5、八进制转二进制
八进制数每一位,转成对应的一个三位二进制数
6、十六进制转二进制
八进制数每一位,转成对应的一个四位二进制数
二、位运算
1、原码、反码、补码
二进制中,最高位是符号位:0表示正数,1表示负数。
正数:原码、反码、补码相同(三码合一)
负数:
- 负数反码=原码符号位不变,其他位取反
- 负数补码=反码+1 (负数反码=补码-1)
-2的原码:
10000000 00000000 00000000 00000010
-2的反码:
11111111 11111111 11111111 11111101
-2的补码:
11111111 11111111 11111111 11111110
2、位运算符
C++一共有6个位运算符(&、|、^、~、>>、<<)
3. 按位与&
4. 按位或|
5. 按位异或^:两位一个为0、一个为1,结果为1,否则为0;
6. 按位取反~
7. 算数右移>>:低位溢出,符号位不变,用符号位补溢出高位
本质上:右移1位,等价于/2
8. 算数左移<<:符号位不变,低位补0
本质上:左移1位,等价于2*
3、变换操作
int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
对于一个不为0的整数,其二进制至少有1位为1。令其-1,则该整数自右往左第一个1变为0,第一个1右侧所有0变为1。再与原数做与操作,则右侧第一个1变为0。上述操作能运行几次,则说明原数中有多少个1.