无符号整数与有符号整数

对于int类型,无符号可表示的数据范围为0 ~ 2^32-1;对于long类型,无符号可表示的数据范围为0 ~ 2^64-1

对于有符号整数,以int型举例,表示的数据个数仍是2^32个,但是数据范围不同;最高位成为符号位,0则是非负位,1则是负位。因此,int类型非负范围为0 ~ 2^31-1 ,负数范围为-2^31 ~ -1

无符号整数的正负转换

取反加一,本文偏算法应用故此处不详细展开。

打印一个数的二进制

利用&以及<<来实现对每一位数字的判断,对于第i位,用掩码1 << i对其进行按位与运算,所得二进制值若为0说明该位是0,不为0则是1。

1
2
3
4
5
6
7
8
9
10
11
12
13
void printBinary(int num) {
for (int i = 31; i >= 0; i--) {
//核心算法,因为==的优先级大于&,注意括号位置
if ((num & (1 << i)) == 0) cout << "0";
else cout << "1";

//每4位加空格
if (i % 4 == 0 && i != 0) {
cout << " ";
}
}
cout << endl;
}

位运算

常见的位运算符:|&^~<<>>>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
printBinary(3); //0000 0000 0000 0000 0000 0000 0000 0011
printBinary(5); //0000 0000 0000 0000 0000 0000 0000 0101

//按位与运算,输出二进制 0000 0000 0000 0000 0000 0000 0000 0001
printBinary(3 & 5);

//按位或运算,输出二进制 0000 0000 0000 0000 0000 0000 0000 0111
printBinary(3 | 5);

//按位异或运算,输出二进制 0000 0000 0000 0000 0000 0000 0000 0100
printBinary(3 ^ 7);

//按位取反运算,输出二进制 1111 1111 1111 1111 1111 1111 1111 1100
printBinary(~3);

//左移位,用0补
//0000 0000 0000 0000 0000 0000 0011 0000
//0000 0000 0000 0000 0000 0011 0000 0000
//0000 0000 0000 0000 0011 0000 0000 0000
printBinary(3 << 4);
printBinary(3 << 8);
printBinary(3 << 12);

//右移位,用符号位数字补
//0000 0000 0000 0000 0000 0000 0000 0001
//0000 0000 0000 0000 0000 0000 0000 0000
printBinary(3 >> 1);
printBinary(3 >> 2);

//1111 1111 1111 1111 1111 1111 1111 1101
//1111 1111 1111 1111 1111 1111 1111 1110
//1111 1111 1111 1111 1111 1111 1111 1111
printBinary(-3);
printBinary(-3 >> 1);
printBinary(-3 >> 2);

位运算的运用