当我们需要获取⼀个整数 x 的⼆进制中第 i 位(从低到⾼,以最低位为第 0 位)是 1 还是 0 的时候,我们可以对 x 做这样的运算: (x >> i) & 1 ,如果结果是 0 ,表⽰第 i 位是 0 ,如果结果是 1 ,表⽰第 i 位是 1

- 确定 x =00101011 的第 3 位的值,只需要将x=00101011 右移 3 位,第 3 位就到最低位,然后和 1 进⾏按位与运算即
题目链接:190. 颠倒二进制位 - 力扣(LeetCode)
1.题目
2.算法原理
我们知道最低位会到最高位,最高位会来到最底位,完成一次颠倒,想象一下以最低位为例,首先要获得这一位,0下标的元素取到31下标,可以获得这一位之后,整体向左移动31位,下标1也要获取,向左移动30位就到下标30了,获取n的第一个2进制位,n&1,第二个二进制位(n>>1)&1,第32个二进制位,(n>>31)&1,n总共是32位,(n>>i)&1,移动完后,用或|,赋值给ret,ret = | (b<<31);
代码:
class Solution {
public:uint32_t reverseBits(uint32_t n) {uint32_t ret = 0;//处理32个二进制位for(int i = 0; i < 32; ++i){//获取n中的一个二进制位存到b里uint32_t b = (n >> i) & 1;//对最低位来说向左移动31位,依此递减,最高位向左移动0位//产生的二进制位b放到ret里,0|a=aret |= (b << (31 - i));}return ret;}
};
应⽤场景(仅了解)
⽐如:在嵌⼊式系统中,传感器通常通过寄存器返回数据。某些寄存器可能包含多个信息字段,例如状态标志、错误代码等。这些字段往往位于寄存器的特定位中,需要通过获取指定位的值来读取。
假设有⼀个传感器状态寄存器,其中:
- 位0-2:传感器状态代码
- 位3:是否存在错误
- 位4-7:保留
unsigned char sensorRegister = 0x0B; // ⼆进制: 00001011
//获取状态代码
sensorRegister & 0x07; //0111
//获取错误标志
(sensorRegister >> 3) & 0x1;
- 我们可以提取状态代码和错误标志来判断传感器的状态