C/C++操作硬件的位运算
上节我们讲了逻辑运算符。C/C++用于综合决策的逻辑运算(两个变量)
本节我们讲位运算。
-
一般用于处理硬件。把地址0x80040的寄存器的最低四位设置成0110
-
使用位运算符:
&, |,~,^,<<,>>
(位与,位或,位非,异或,左移,右移) -
什么是位:
一个字节8位,内存一个字节一个字节的排列。
位与 &
-
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1
对应位,都是1结果才是1 -
19 & 7
0001 0011
0000 0111 &
0000 0011 -> 3
例子:
#include <iostream>
int main() {
std::cout << (19 & 7) << std::endl;
return 0;
}
输出结果:
3
- 注意: 要用括号把19&7括起来
位或 |
-
0 & 0 0
0 & 1 1
1 & 0 1
1 & 1 1
对应位,都是0结果才是0 -
19 & 7
0001 0011
0000 0111 |
0001 0111 -> 23
例子:
#include <iostream>
int main() {
std::cout << (19 | 7) << std::endl;
return 0;
}
输出结果:
23
- 注意: 要用括号把19|7括起来
位非 ~
-
~0 1
~1 0
取反 -
unsigned char x = ~19
~19
0001 0011 ~
1110 1100 -> 236
例子:
#include <iostream>
int main() {
unsigned char x = ~19;
std::cout << (int)x << std::endl;
return 0;
}
输出结果:
236
异或 ^
-
0 & 0 0
0 & 1 1
1 & 0 1
1 & 1 0
对应位不同,才是1 -
19 ^ 7
0001 0011
0000 0111 ^
0001 0100 -> 20
例子:
#include <iostream>
int main() {
std::cout << (19 ^ 7) << std::endl;
return 0;
}
输出结果:
20
- 注意: 要用括号把19^7括起来
左移 <<
-
右边的位用0来填充,移动超出左边边界的位则直接抛弃。
向左移动n个位置,就等同于乘以2n
-
注意: 只适用于
short/int/long/char
等定点数类型(float/double
浮点数不能使用) -
19 << 2
0000 0001 0011 <<
0000 0100 1100 -> 76
相当于乘以22
右移 >>
-
左边的位用0来填充,移动超出右边边界的位则直接抛弃。
向右移动n个位置,就等同于除以2n
-
注意: 只适用于
short/int/long/char
等定点数类型(float/double
浮点数不能使用) -
19 >> 2
0000 0001 0011 >>
0000 0000 0100 -> 4
相当于除以22
问题解决
- 问题:把一个整数的最低四位设置成0110
- 第一步:把数字的后四位清空。
- 第二步:与0110进行位或
#include <iostream>
int main() {
int x;
std::cout << "请输入一个整数";
std::cin >> x;
//将最低四位清零
//其他位不变
x = x & (~15);
//把最低四位设置成0110
x = x | 6;
std::cout << x << std::endl;
return 0;
}
输入:46
输出结果:
38
- 分析:38的二进制为0010 0110成功
本节介绍了位运算符。下节讲运算符的优先级。