bit - evenBitParity - 如果 x 的偶数索引位中有奇数个为 0,则返回 1(x 的第 0 位是 1 的位置)
问题描述
这是一个有点操纵的问题。
/*
evenBitParity - returns 1 if an odd number of the even-indexed bits of x are 0's (bit 0 of x is the 1's place)
Examples:
evenBitParity(0) = 0 (16 zero even-indexed bits),
evenBitParity(2) = 0 (16 zero even-indexed bits, bit 1 is non-zero but not even-indexed)
evenBitParity(3) = 1 (15 zero even-indexed bits),
evenBitParity(5) = 0 (14 zero-indexed bits),
evenBitParity(7) = 0
evenbitParity(21) = 1
Legal ops: ! ~ & ^ | + << >>
Max ops: 15
Rating: 4
*/
int evenBitParity(int x) {
}
我尝试用下面的代码来解决它,但是操作太多所以我没有得到充分的信任。谁能为此提供更好的解决方案?非常感谢!
int masker = (0x55 << 8)+0x55;
masker = (masker<<16)+masker;
x = x&masker;
x = x ^ (x >> 1);
x = x ^ (x >> 2);
x = x ^ (x >> 4);
x = x ^ (x >> 8);
x = x ^ (x >> 16);
return x&1;
解决方案
自己试试这个。改进后的版本是 ebp2();
你不需要使用面具和所有这些。只需省略第一个移位即可忽略所有奇数索引位。
我认为我应该为我的努力喝一杯啤酒或至少一杯咖啡。
int main(int argc, char** argv){
int x;
x = 0;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
x = 2;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
x = 3;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
x = 5;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
x = 7;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
x = 21;
printf("%d\t%d\t%d\n", x, ebp1(x), ebp2(x));
}
int ebp1(int x){
int masker = (0x55 << 8)+0x55;
masker = (masker<<16)+masker;
x = x&masker;
x = x ^ (x >> 1);
x = x ^ (x >> 2);
x = x ^ (x >> 4);
x = x ^ (x >> 8);
x = x ^ (x >> 16);
return x&1;
}
int ebp2(int x){
x = x ^ (x >> 2);
x = x ^ (x >> 4);
x = x ^ (x >> 8);
x = x ^ (x >> 16);
return x&1;
}
推荐阅读
- java - JTextField 更改边框
- spring - 春季无法使用wkhtmltopdf将html页面生成为pdf
- javascript - 未定义错误“propTypes”且未定义错误“defaultProps”
- r - R中二进制数据的分类
- matlab - 为什么将对象分配给子图声明对象被删除?
- python - 存储考勤数据的最有效或最有用的方法是什么?
- sql-server - SQL 查询以读取文本文件并仅显示从中选择的内容
- python - 使用 Flask 编辑和更新 sqlite3 视图
- bash - Jenkins sh 运行函数
- java-8 - Iterate lists of different length using Java 8 streams