确定是否所有偶数位(从左到右计数)都设置为1.例如,0101 0101
将计数,而1011 1000
将不计数。
如果该位在所有偶数位置都为1,则返回1,否则返回0.
约束:必须只使用按位运算符。不能使用条件。您可以在表达式中使用的最大整数是0xFF
。
这是我的代码:
int allEvenBits(int X) {
int x1 = !((X & 0x55) ^ 0x55);
int x2 = !(((X >> 8) & 0x55) ^ 0x55);
int x3 = !(((X >> 16) & 0x55) ^ 0x55);
int x4 = !(((X >> 24) & 0x55) ^ 0x55);
return x1 + x2 + x3 + x4;
}
以上内容返回1:1011 0010 1001 0010 1011 1001 1111 1111
如何修改它以使其与约束一起使用?
答案 0 :(得分:5)
假设>>
计为按位运算符,以下只需要16个常量。
int allEven(unsigned x) {
x &= x >> 16;
x &= x >> 8;
x &= x >> 4;
x &= x >> 2;
return x&1;
}
答案 1 :(得分:0)
使用位移和按位 - 和:
int f(unsigned x) {
x&= x>>16;
x&= x>>8;
x&= x>>4;
x&= x>>2;
return x&1;
}
如果我们有更大的常数,这将是最好的:
int f(unsigned x) {const unsigned mask = 0x55555555; return mask == (mask&x);}
答案 2 :(得分:0)
假设sizeof(int) == 4
:
int all_even(int x) {
int all_even = (0x55<<24)|(0x55<<16)|(0x55<<8)|0x55;
return x == ((x & ~all_even) | all_even);
}
读为&#34;如果我在x
中设置了所有偶数位,那么这个新数字是否与x
相同?&#34;