C语言----位运算

按位与

a & b
只有两个数所在的位都是1,才等于1,否则为0;
用处:

  1. 改变一个数某一个位为0,其他位不变;(如a & 0xFE,最后一位变为0,其他位不变)
a = 1010 0111
a & 1111 1110 = 1010 0110
  1. 取一个数的某一段;(如b & 0xFF,可以得到b最后8位的值)
b = 1111 ... 1111 1010 1010
b & 1111 1111 = 0000 ... 0000 1010 1010

按位或

a | b
两个数有一个数所在的位上是1,则为1,否则为0;
用处:

  1. 使得某一个位上或几个位上的数为1,其他位不变;(如a | 0x01,使a最后一位上的数为1,其他位不变)
a = 0101 0100
a | 0000 0001 = 0101 0101
  1. 使两个数拼接起来;(如0x00FF | 0xFF00 = 0xFFFF)

按位取反

~a
使这个数上的每一位1变成0,0变成1;
用处:

  1. 得到全部为1的数;(~0)
  2. 使连续某几位变为0/1;(如7是0x0111,a | (7)使得a的后三位变为1,a & (-7)使得a的后三位变为0)

按位异或

a ^ b
两个数,如果相同位上的数相等,结果为0,不相等结果为1;
用处:

  1. 如果两个数相等,那么a ^ b = 0;
  2. 用一个变量对同一个值异或两次,等于没做,又变回原来的数;(a ^ b ^ b = a)

移位

  1. 左移(i<<j)
    i中所有的位数向左移j位,右边缺位补0;
    所有小于int的类型,移位以int的方式来做,结果是int;
    x <<= 1,相当于x *= 2;
    x <<= n,相当于x *= 2^n;

  2. 右移(i>>j)
    i中所有位向右移j位,当数据i为unsigned类型时,左边缺位补0,当数据i为signed类型时,左边填入原来的做高位(保持符号不变);
    所有小于int的类型,移位以int的方式来做,结果是int;
    x >>= 1,相当于x /= 2;
    x >>= n,相当于x /= 2^n;

#示例代码

int a = 0x80000000;
unsigned int b = 0x80000000;
printf("a<<1 = %x\n", a<<1);
printf("a>>1 = %x\n", a>>1);
printf("b<<1 = %x\n", b<<1);
printf("b>>1 = %x\n", b>>1);

#结果

a<<1 = 0
a>>1 = c0000000
b<<1 = 0
b>>1 = 40000000

----参考翁凯老师视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值