【发布时间】:2014-10-18 22:34:50
【问题描述】:
我有一个表示 8x8“位”块的数组
unsigned char plane[8]
我想要做的是水平循环通过这个“位”块
并计算之间发生变化的次数
1 和 0。
当我提取一点时,它被存储在一个 unsigned char,所以基本上我想增加一个计数 当一个字符为非零而另一个字符为零时。
我有以下内容:
int getComplexity(unsigned char *plane) {
int x, y, count = 0;
unsigned char bit;
for(x = 0; x < 8; x++) {
for(y = 0; y < 8; y++) {
if(y == 0) {
bit = plane[x] & 1 << y;
continue;
}
/*
MISSING CODE
*/
}
}
}
对于缺少的代码,我可以这样做:
if( (bit && !(plane[x] & 1 << y)) || (!bit && (plane[x] & 1 << y)) ) {
bit = plane[x] & 1 << y;
count++;
}
但是,我真正想看看是否有一些 聪明的按位运算来代替这一步 有两个单独的测试。
【问题讨论】:
-
BitScanForward 内在可以为你做到这一点
-
你可以做类似
popcount(A ^ (A << 1))的事情。不过,您可能需要小心边缘 -
另一种选择:每个
y将字节旋转一位,如ideone.com/jfcSNk -
((x && !y) || (!x && y)) == (!x != !y). -
一种更有效的方法是预先计算一个表。当然,内在函数仍然更有效。
标签: c bit-manipulation