位运算符
符号 | 含义 | 解读 |
---|---|---|
& | 按位与 A:0001 0101 B:1101 0110 ------------------- C:0001 0100 A且B,必须2个都是真 |
1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 |
&& | 逻辑与 | '' |
| | 按位或 A:0001 0101 B:1101 0110 ------------------- C:1101 0111 A或B,有一个是真就是真 |
1 | 1 = 1 1 | 0 = 1 0 | 1 = 0 0 | 0 = 0 |
|| | 逻辑或 | '' |
~ | 按位取反 将变量i的所有二进制位取反 |
i:(补0)0011 ~i:(补1)1100 |
^ | 按位异或 相同为0,不同为1 | 1 ^ 0 = 1 1 ^ 1 = 0 0 ^ 0 = 0 0 ^ 1 = 1 |
<< | 按位左移 | |
>> | 按位右移 |
按位与分析
5 & 7 = 5
21 & 7 = 5
5 & 1 = 1
5 & 10 = 0
-5 & 10 =
3 | 5
011 3
101 5
111 7
~3
(3,前面补0)0011
(~3,取反,前面补1)1100
(根据补码,负数绝对值是 取反➕1)0100 = 4 所以是 -4
按位与作用
求变量的第n位的值是0还是1
举例:
变量a:我想知道其第1位和第3位的值。可以做信息采集
a & 0101
如果a的第1位和第3位都是1,则按位与结果 是0101
如果a的第1位和第3位都是0,则按位与结果 是0000
所以
#inlude <stdio.h>
int main(void) {
int i = 5;
int j = 7;
int k;
k = i & j;
printf("%d\n",k);
# k的值只能是1或零,因为逻辑运算符的结果只能是真(1)或假(0)
k = i && j;
printf("%d\n",k);
}
10进制左移右移
123 左移1位:1230 相当于 ✖️10
123 右移1位:12 相当于 ➗ 10
二进制由此类推:
二进制左移相当于 ✖️ 2 左移右侧补零
二进制右移相当于➗2 右移左侧补零 或补1,看最高位是0还是1(一般补零)
左移n位相当于✖️2n
右移不能移动太多,移没了比如:123 右移10位,移没了。
网友评论