位操心常见经典用法

59 篇文章 4 订阅
14 篇文章 0 订阅

位操作包括:

  1. 与 &
  2. 或 |
  3. 非(取反)~
  4. 异或 ^
  5. 左移 <<
  6. 右移 >>

使用位操作实现常用功能

1 快速判断偶数,判断最低位是0还是1即可,比求模运算快

  • x%2 != 0 // x正负都可以判断;不能用x%2 == 1,因为如果x为负奇数,x%2=-1
  • x&0x1 == 0 //最好最快的方法,使用与正负数都可

2 交换两个数,不用中间变量

void Swap(int &a, int &b)
{
    if (a != b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

3 求整数的二进制表示中1的个数(包含符号位),不用一个一个的移位判断

 int numOfBit1(int a)
 {
      int cnt = 0;
     while(a != 0)
      {
        ++cnt;
        a &= a - 1;    //将最右边的1置为0;正负都可计算,负数是按照补码计算的,最后的符号位也被统计
        //a|=a-1;//统计的是0的个数
      }
     return cnt;
 }

4 负转换,不使用正负号。不管正数负数,取反后加1即可

//就是利用定义:负数的表示是补码,补码为反码+1
 int a = 1;
 a = ~a + 1;   //a变成-1
 a = ~a + 1;   //a又变成1

5 求绝对值,不判断正数负数,不使用正负号,返回绝对值

 int myAbs(int a)
 {
     int sign = a >> 31;           //如果a为正数,sign为0;否则sign为-1,即0xFFFFFFFF
     return (a^sign) - sign;    //(a^0)-0 = ,  (a^-1)-(-1) = ~a+1 = -a  ,a^-1即为a取反
 }

6 其它

//将双字节中某一位置1
void SetN1(unsigned short *pBuf, int n)
{
    (*pBuf) |= 1<<n;
}

//将双字节中某一位清零
void SetN0(unsigned short *pBuf, int n)
{
    (*pBuf) &= ~(1<<n);
}

//将单字节中某一位置1
void SetN1(unsigned char *pBuf, int n)
{
    (*pBuf) |= 1<<n;
}

//将单字节中某一位清零
void SetN0(unsigned char *pBuf, int n)
{
    (*pBuf) &= ~(1<<n);
}

//获得单字节中某一位的值
int Get1Bit(unsigned char buf, int n)
{
    return (buf>>n) & 0x01;
}

//获得双字节中某一位的值
int Get1Bit(unsigned short buf, int n)
{
    return (buf>>n) & 0x01;
}

//获得单字节中两位的值
int Get2Bit(unsigned char buf, int n)//n必须是2的倍数
{
    return (buf>>n) & 0x03;
}

//获得双字节中两位位置(n)处的值
int Get2Bit(unsigned short buf, int n)//n必须是2的倍数
{
    return (buf>>n) & 0x03;
}

//将单字节中两位位置(n)处,设置数值(m)
void Set2Bit(unsigned short *pBuf, int n, int m)//n必须是2的倍数
{
    (*pBuf) |= m<<n;
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值