说a
是我的号码。
我希望a1
成为偶数位置反转的所有位。
这是我目前的解决方案
int a1 = ((a & 0xaaaaaaaa) | (~(a) & 0x55555555));
如何让它更快?
答案 0 :(得分:5)
使用按位xor(^
)运算符:
a1 ^= 0x55555555;
这将反转位0,2,4等。
答案 1 :(得分:1)
使用按位xor ^
答案 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);
}