按位运算

落爺英雄遲暮 提交于 2020-02-28 23:38:41

按位运算
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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!