如何删除 C 中的所有赔率位?

Ily*_*Key 3 c bit-manipulation bit

我有 int 136970250 (1000 0010 1010 0000 0000 0000 1010) -> 我需要删除所有奇数位(1,3,5,7...)

1000 0010 1010 0000 0000 0000 1010 -> 10 0111 0000 0011 (9987) - 因为这些位没有信息。

怎么做?

chu*_*ica 5

我怎样才能消除所有的赔率位...?
我需要删除所有奇数位(1、3、5、7...)

OP 的单个示例看起来像是保留奇数位,因为最低有效位通常是位 0。

这个答案假设代码需要保留偶数位并丢弃奇数位。很容易调整算法以保留其他位。


不是进行 32 次迭代的循环,而是按组移位。首先将所需的位配对,然后以 4 个为一组,然后以 8 个为一组,依此类推。

假设我们要保留位0b .a.b .c.d .e.f .g.h .i.j .k.l .m.n .o.p

uint16_t IK_RemoveOddBits(uint32_t x) {
  // x = 0b .a.b .c.d .e.f .g.h .i.j .k.l .m.n .o.p

  x = ((x & 0x44444444) >> 1) | ((x & 0x11111111) >> 0);
  // x = 0b ..ab ..cd ..ef ..gh ..ij ..kl ..mn ..op

  x = ((x & 0x30303030) >> 2) | ((x & 0x03030303) >> 0);
  // x = 0b .... abcd .... efgh .... ijkl .... mnop

  x = ((x & 0x0F000F00) >> 4) | ((x & 0x000F000F) >> 0);
  // x = 0b .... .... abcd efgh .... .... ijkl mnop

  x = ((x & 0x00FF0000) >> 8) | ((x & 0x000000FF) >> 0);
  // x = 0b .... .... .... .... abcd efgh ijkl mnop

  return x;
}
Run Code Online (Sandbox Code Playgroud)

要删除偶数位,请通过添加x >>= 1或简单地修改上面的代码

uint16_t IK_RemoveEvenBits(uint32_t x) {
  return IK_RemoveOddBits(x >> 1);
}
Run Code Online (Sandbox Code Playgroud)

提示:在编码这些移位类型问题时最好使用无符号类型。无需扩展有符号整数的符号位。