揭秘OpenGL红宝书中棋盘生成程序(三)

2014-11-24 12:08:21 · 作者: · 浏览: 2
0][1] = FF, checkImage[0][30][2] = FF
checkImage[0][31][0] = FF, checkImage[0][31][1] = FF, checkImage[0][31][2] = FF

上面的规律是,不管最高位是否为1,只要二进制的千分位为1,就可在和0x8位与后其值为真。

在所有小于64的数中,符合二进制的千分位为1这个条件的数有:

8 - 15
24 - 31
40 - 47
56 - 63

揭秘完毕,总结规律:

位与运算不仅可以屏蔽特定位,巧用位与表达式可以在特定数值间来回翻转。

例如:如果需要连续的4个数且每隔4位翻转一次,则可用下面的代码:

for (int i = 0; i < 30; i++) {
if ((i &0x4) == 0) {
printf("%d ", i);
}
}

结果为:

0 1 2 3 8 9 10 11 16 17 18 19 24 25 26 27

多试几个数,以期获得规律的灵感。

下面将checkImageWidth及checkImageHeight均改为256之后,将屏蔽因子改为0x16后的


图像:

0x32的图像:

实在是没力去思考为什么了。



摘自 Sarkuya的 编程园地