交换字节中的一对比特

Rav*_*hak 10 bit-manipulation

我有一个任意的8位二进制数,例如,11101101

我必须交换所有这些位,如:

在交换之前:11-10-11-01 交换之后: 11-01-11-10

我在接受采访时被问到这个问题!

Mar*_*ers 32

在伪代码中:

x = ((x & 0b10101010) >> 1) | ((x & 0b01010101) << 1)
Run Code Online (Sandbox Code Playgroud)

它的工作原理是分别处理每个位对的低位和高位,然后组合结果:

  • 表达式x & 0b10101010从每对中提取高位,然后>> 1将其移位到低位位置.
  • 类似地,表达式(x & 0b01010101) << 1从每对中提取低位并将其移位到高位位置.
  • 然后使用按位OR组合这两个部分.

由于并非所有语言都允许您直接编写二进制文字,因此可以将其编写为十六进制:

Binary        Hexadecimal  Decimal 
0b10101010    0xaa         170
0b01010101    0x55         85

  • 鉴于并非所有语言都遵循模式0b ...,可能值得注意的是,它分别是0xAA和0x55(十六进制). (3认同)

tda*_*ers 5

  1. 制作两个位掩码,一个包含所有偶数位,另一个包含不均匀位(1010101001010101).
  2. 使用按位 - 并将输入过滤为两个数字,一个将所有偶数位置零,另一个将所有不均匀位置零.
  3. 将仅包含偶数位的数字向左移一位,将另一位向右移一位
  4. 按位使用 - 或将它们组合在一起.

16位示例(非实际代码):

short swap_bit_pair(short i) {
    return ((i & 0101010110101010b) >> 1) | ((i & 0x0101010101010101b) << 1));
}
Run Code Online (Sandbox Code Playgroud)