从二进制数反转偶数位上的位

时间:2014-04-22 14:19:13

标签: c

a是我的号码。

我希望a1成为偶数位置反转的所有位。

这是我目前的解决方案

int a1 = ((a & 0xaaaaaaaa)  | (~(a) & 0x55555555));

如何让它更快?

4 个答案:

答案 0 :(得分:5)

使用按位xor(^)运算符:

a1 ^= 0x55555555;

这将反转位0,2,4等。

答案 1 :(得分:1)

使用按位xor ^

请参阅C++ bitwise operators

答案 2 :(得分:1)

对于不依赖于int为32位的解决方案(但取决于int的偶数位宽度):

// Use `^` operator as suggested by @unwind
int a1 ^= UINT_MAX/3;

答案 3 :(得分:1)

已经给出的32位解决方案可能是您想要的,也可能是您应该接受的正确答案。但仅仅因为有人想知道什么是通用解决方案,我开始思考它。这是一个非常通用的解决方案,允许所有类型的奇怪东西...... :)

请注意,此代码的效果远远低于预期数据类型的直接XOR。

#include <stdint.h>

typedef enum
{
  INVERT_ODD        = 0xAA,
  INVERT_EVEN       = 0x55,
  INVERT_LS_NIBBLES = 0x0F,
  INVERT_MS_NIBBLES = 0xF0,
  ...  // and so on
} invert_pattern_t;

void invert_bits (void* data, size_t size, invert_pattern_t pattern)
{
  uint8_t* byte = data;

  for(size_t i=0; i<size; i++)
  {
    byte[i] ^= (uint8_t)pattern;
  }
}

示例代码:

#include <stdio.h>

int main()
{
  uint32_t data32 = 0x12345678;

  printf("%.8X ", data32);
  invert_bits(&data32, sizeof(data32), INVERT_EVEN);
  printf("inverted: %.8X\n", data32);
}