问题:
把地址为0x80040的寄存器的最低4位设置为0110
解决方案:
使用位操作
什么是位?
内存的基本单元是字节, 一个字节有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; //822*2 = 64
右移
如果左操作数是无符号类型,则左边多出来的位用 0 来填充。
如果左操作数是有符号类型,则左边多出来的位用 符号位(最高位) 来填充。
向左移动 n个位置,就等同于除以 2的n次方
只适用于: int/short/long/char 等定点数类型(float/double浮点数类型不能使用)
// 00001000
// 00000001
cout << (8>>3) << endl; //1
应用:
把一个整数的的最低4位设置为0110
cout << "请输入一个整数: " << endl;
cin >> x;
//把x的最低4位清0
x = x & (~15);
//把x的最低4位设置为0110
x = x | 6;
cout << “x=” << x << endl;