位运算技巧

引言:

我们知道程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。
在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型



1 按位与(&)

运算规则:

0&0=0 0&1=0 1&0=0 1&1=1
同时为1 结果为1

技巧:
1:判断奇偶:

if(0 == (a & 1)) {
结果为偶数
}

2:清零

如果想将一个单元清零,即用 0 & 单元
则该单元清零

3:取一个数指定位

用指定位数低位数为1,高位数为0 与该数按位与,即得到指定位

2 .按位或( | )

运算规则:

0|0=0 0|1=1 1|0=1 1|1=1
同时为0 结果为0
注意:负数按补码形式参加按位或运算。

用途

常用来对一个数据的某些位设置为1
设一个数低位为1,高位为0,用这个数与某个数据按位或

例如:
数 X=1010 1110 的低4位设置为1,
令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或。

3 . .异或(^)

运算规则:

0^0=0 0^1=1 1^0=1 1^1=0
如果两个相应位相同为0,相异为1。

用途:
1:交换两个数

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

2:翻转指定位

数 X=1010 1110 的低4位进行翻转,令Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
异或的几条性质:

1、交换律
2、结合律 (a^ b) ^ c == a ^ ( b ^ c)
3、对于任何数x,都有 x ^ x=0,x ^ 0=x
4、自反性:a^ b ^ b=a ^ 0=a;

4.取反 (~)

运算规则:

~1=0 ~0=1
对一个二进制数按位取反,即将0变1,1变0。

交换符号

int reversal(int a) {
  return ~a + 1; //整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数
}

5.右移(>>)

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

操作数每右移一位,相当于该数除以2。

6.左移运算符(<<)

定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

例题

例题:
颠倒给定的 32 位无符号整数的二进制位
示例 1:

输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

示例 2:

输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

代码

uint32_t reverseBits(uint32_t n) {

  uint32_t x = 1, y = 0;  	// y用来记录翻转的位

  for(int i = 1; i <= 31 ; i++) //记录三十一次,最后一次不用移位

  {

    y |= (n & x);		

    n>>=1;

    y<<=1;
	
  }						//太强了!!!

  y |= (n & x);

  return y;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值