按位运算
C有这些按位运算的运算符:
&按位的与
|按位的或
~按位取反
^按位的异或
<<左移
右移
1.按位与&
(x)i1并且(y)i1,那么(x&y)i=1
否则的话(x&y)=0
两个整数按位与,如果对应的位上,比如x的第i位和y的第i位都是1,的话,与的结果就是1,否则是0
如:
01011010 16进制的5A
10001100 16进制8C
与的结果
00001000 结果08
按位与常用于两种应用:
①让某一位或某些位为0:
x & 0xFE,FE是11111110
如:
11111110 &
10100101
得:
10100100
前7位不变,最后一位变成了0
所以那1和别的数相与,意味着要看那个数等于多少
②取一个数中的一段:x & 0xFF
具体给出多少个二进制的1,那些1对应的位会留下来,其它为都变0拿走
2.按位或|
如果(x)i1或(y)i1,那么(x|y)i=1,否则的话(x|y)i=0
如:
10101010 AA |
01010100 54
得:
11111110 FE
按位或常用于两种应用:
①使得一位或几位为1:
如:x|0x01 希望这个数最右边的最后一个比特是1,或1就变1
②把两个数拼起来: 0xooFF|0xFF00
4.按位取反~
(-x)i=1-(x)i
把1位变0,0位变1
如:
10101010 AA
01010101 55
想得到全部位为1得数:~0
7的二进制数是0111,x|7使得低3位为1,
而x&~7,就使得低3位为0
int main()
{
unsigned char c=0xAA;
printf("c=%hhx\n",c);//c=aa
printf("~c=%hhx\n",(char)~c);//按位取反 ~c=55
printf("-c=%hhx\n",(char)-c);//补码 -c=56
return 0;
}
5.逻辑运算VS按位运算
对于逻辑运算,它只看到两个值:0和1
可以认为逻辑运算相当于把所有非0值都变成1,然后做按位运算
5&4–>4 而5&&a–1&1–>1
5|4–>5 而5||4–>1|1–>1
~4–>3 而!4–>!1–>0
6.按位异或^
如果(x)i==(y)i,那么(x^y)i=0
否则的话,(x^y)i==1
如:
10110100^
01001011
得:
11111111
如果两个位相等,那么结果为0;不相等,结果为1
如果x和y相等,那么x^y的结果为0
对一个变量用同一个值异或两次,等于什么也没做
xyy–>x
来源:CSDN
作者:变女侠吧
链接:https://blog.csdn.net/weixin_45087108/article/details/104562516