目录
什么是位?
内存的基本单元是字节, 一个字节有8位.
位与 &
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1
对应位, 都是1, 结果才是1
// 00001000
// 00000011
// 00000000
cout << " 8 & 3 = " << (8 & 3) << endl;
位或 |
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1
对应位, 都是0, 结果才是0
只要有一位是1, 结果就是1
0 | x x
// 00001000
// 00000011
// 00001011
cout << " 8 | 3 = " << (8 | 3) << endl;
位非 ~
~ 1 0
~ 0 1
取反
// 00001000
// 11110111
unsigned char x = ~8;
cout << (int)x << endl; //247
异或 ^
0 ^ 0 0
1 ^ 1 0
0 ^ 1 1
1 ^ 0 1
对应位不同, 结果才是1
// 00001000
// 00000011
// 00001011
cout << (8^3) << endl; //11
<< 左移
右边的位用 0 来填充, 移动超出左边边界的位则直接抛弃。
向左移动 n个位置,就等同于乘以 2的n次方
只适用于: int/short/long/char 等定点数类型(float/double浮点数类型不能使用)
// 00001000
// 01000000
cout << (8<<3) << endl; //8*2*2*2 = 64
>> 右移
如果左操作数是无符号类型,则左边多出来的位用 0 来填充。
如果左操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。
向左移动 n个位置,就等同于除以 2的n次方
只适用于: int/short/long/char 等定点数类型(float/double浮点数类型不能使用)
// 00001000
// 00000001
cout << (8>>3) << endl; //1