0

该代码来自一个 Qt 库,该库有助于生成具有图像形状的按钮;它扫描所有行 y 和所有宽度 x,当像素的 rgb 部分与掩码部分重合时生成以下更改(mp 是行开头的指针,并且预填充为 0xff):

*(mp + (x >> 3)) &= ~(1 << (x & 7));

我真的无法解释它;有背景的人可以帮忙吗?

4

2 回答 2

1

从代码的外观来看,mp 指向每像素 1 位图像的当前行。代码清除表示 X 处像素的位。它将 X 偏移量转换为字节偏移量 (x >> 3),然后将字节与掩码进行逻辑与,该掩码是从字节内左移 X 位置的逆 1 创建的。

于 2012-04-26T14:44:26.163 回答
0

为凡人;好的,背景:http ://www.cprogramming.com/tutorial/bitwise_operators.html; &= 表示我们要进行按位乘法;在 rhs 中,~ 是补码,所以它用 0 翻转 1,反之亦然;二进制中的 7 末尾有 3 个 1,前面全为零,因此 x & 7 保留 x 中的最后 3 位;结合 << 这将根据指数将第一位中的 1 从 char 1 向左移动一定数量的位置;由于指数仅使用 x 的最后 3 位,因此它小于 8(2^3);因此,带有 1 的位将位于 char 的 8 位内的 1-8 位置;翻转〜将把东西变成全1,除了那个神奇的位置;&= 执行的乘法将保留 lhs 中的所有内容,除了一位。现在是 lhs;我们在右移操作中用 >> 踢出 x 的最后一个字节或最后 3 位;这意味着我们将为 x 的每 8 个增量修改相同的字节(mp 的 char 类型)的位置;当我们“跳转”时,我们只会跳一个字节;当 x=9 时,它将转到 mp+1,当 x=17 时,它将转到 mp+2;所以它就像整数运算中的 x/2^3,但在一次移位运算中;好的,现在我们有了理解整个事情的要素;

tmask 已预填充 0xff,全为 1;这意味着它将在 &= 操作上是被动的,保留 rhs 指示的内容;这意味着如果在检查特定像素是否等于背景的 if 语句中有命中,则执行此行,我们将擦除与像素相关的特定位;

于 2014-04-04T01:03:03.760 回答