Section 7.位运算

一、基础知识

  • &:与:两个位都为1时,结果才为1

3&5 即 0000 0011 & 0000 0101 = 0000 0001,因此 3&5 的值得1

  • |:或:两个位都为0时,结果才为0

3|5即 0000 0011 | 0000 0101 = 0000 0111,因此3|5的值得7

  • ^:异或:两个位相同时为0,相异时为1

3^5即 0000 0011 ^ 0000 0101 = 0000 0110,因此3^5的值得6

//交换两个数
void Swap(int &a, int &b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}
  • ~:取反:0变成1,1变成0

~3即 ~ 0000 0011 = 1111 1100,因此~3的值得508

使a的最低位为0,可以表示为:a & ~1。~1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0

  • <<:左移:各二进位全部左移若干位,高位丢弃,低位补0
  • >>:右移:各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
  • 原码:最高位为符号位,0表示正数,1表示负数

x = 0b11 (3),四比特表示原码 0011(3) ;x = - 0b11(-3) ,四比特表示原码 1011(11) ;

  • 反码:最高位为符号位,0表示正数,1表示负数;正数的反码等于本身,负数的反码除符号位外,各位取反  

x = 0b11 (3),四比特表示原码 0011(3),对应反码为 0011(3) ;x = - 0b11(-3) ,四比特表示原码 1011(11),对应反码为 1100(12),补码为1101(13)   

  • 补码: 最高位为符号位,0表示正数,1表示负数;正数的补码等于本身,负数的补码等于反码+1:

x = 0b11 (3),四比特表示原码 0011(3),对应反码为 0011(3) ,补码为 0011(3);x = - 0b11(-3),四比特表示原码 1011(11),对应反码为 1100(12),补码为 1101(13);

二、应用

1.n的二进制表示中第k位是几?

  1. 先把第k位移到最后一位n>>k
  2. 看个位是几:x&1

n>>k&1(优先级从左往右)

 2.lowbit(x):返回x的最后一位1  【树状数组基础】

x=1010,则lowbit(x)=10;x=101000,则lowbit(x)=1000

  • 实现方法:x&-x =x&(~x+1)

         x     = 1010......100......0

       ~x     = 0101......011......1

    ~x+1    = 0101......100......0

x&(~x+1) = 0000......100......0

三、配套练习

AcWing801icon-default.png?t=LBL2https://www.acwing.com/problem/content/803/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值