我是这样做的:How do you set, clear and toggle a single bit in C?。
清除一点
使用按位AND运算符(
&
)清除一点。number&amp; =〜(1 <&lt; x);
这将清除位
x
。你必须用位反转位串 按位NOT运算符(~
),然后是AND。
它适用于有符号整数类型,但不适用于无符号整数(例如UInt32)。编译器说,对无符号类型执行这种操作是不可能的。那么如何处理无符号数以清除一位呢?
答案 0 :(得分:2)
实际上并没有这么说。它说“不能隐式地将类型'int'转换为'uint'。存在显式转换(你是否错过了演员?)”
这是因为1 << x
的类型为int
。
尝试1u << x
。
答案 1 :(得分:1)
UInt32 number = 40;
Int32 x = 5;
number &= ~((UInt32)1 << x);
答案 2 :(得分:0)
如果将复合运算符long
替换为普通uint
,则可以将结果(&=
)转换回&
:
uint number = /*...*/;
number = (uint)(number & ~(1 << x));
另一种方法是使用unchecked
块:
uint number = /*...*/;
unchecked
{
number &= (uint)~(1 << x);
}