我们在讲座中还没有做到这一点,我正在尝试找出如何用一个(或)替代单个异或订单。 有人可以告诉我该怎么做吗?
(完整代码显示用#书写的“ LED-DISPLAY”)
void toggle_pixel_v2(unsigned int pixel_number, void *adr) {
char *pc = (char *)adr;
int ioff = (pixel_number-1) / 8;
int ibit = (pixel_number-1) % 8;
if ( pc[ioff] & (1<<ibit) ) pc[ioff] &= ~(1<<ibit);
else pc[ioff] |= (1<<ibit);
}
答案 0 :(得分:0)
让a
为b
中位置A
的位。
A &= ~(1<<b)
清除a
。 A |= (1<<b)
设置了a
。这两个操作都使A
的其余部分保持不变,因为x & 1 = x
和x | 0 = x
。
使用A = pc[ioff]
和b = ibit
,您的代码将清除a
(如果已设置),并清除未设置的代码。这是异或结果的结果:由于在(1<<b)
中仅设置了位置b
的位,因此A ^ (1<<b)
的结果为A
,其中a
切换(因为x ^ 1 = ~x
和x ^ 0 = x
)。
因此以下两个代码是等效的:
if (A & (1<<b))
A &= ~(1<<b);
else
A |= (1<<b);
A ^= (1<<b);