【发布时间】:2018-07-25 09:44:40
【问题描述】:
例如,如果我想在 y 的位置 n(在 C 中)设置一个位
y = y | (1 << n)
但是如果我想在位置 n 删除 y 中的一点,我必须在二进制 AND 之后使用 ~ 运算符。
y = y & ~(1 << n);
我的问题:为什么我必须使用 ~ 运算符?
这是因为结果变成了负区吗?
【问题讨论】:
-
没有“负”数,只有位。拿一张纸和一支铅笔,用手做这些操作。你好德摩根。
-
因为要设置一个位,您需要将值与具有单个位设置的掩码进行或运算。要重置(“删除”)位,您必须将值与具有所有位设置的掩码除了该位。
~反转一位掩码以执行 AND。 -
"为什么我必须设置 ~ 运算符?"不,
~是一种方式。y = (y |(1 << n)) ^ (1 << n);是另一个。解决这个问题的方法很多。除非1满足y的宽度,否则是错误的做法。