【发布时间】:2011-06-13 12:08:53
【问题描述】:
int max = ~0;
什么意思?
【问题讨论】:
-
看这个
why -3==~2(stackoverflow.com/questions/4471823/why-3-2-in-c)
标签: c# bitwise-operators
int max = ~0;
什么意思?
【问题讨论】:
why -3==~2 (stackoverflow.com/questions/4471823/why-3-2-in-c)
标签: c# bitwise-operators
~ 操作符有点反,所以 ~0 给你一个全为 1 的整数值(二进制)。
【讨论】:
它是字节 0000....0000 的按位否定。它是所有位都设置为 1 的整数值。
在无符号情况下,它将是最大可能值。在有符号的情况下,它是 -1。
【讨论】:
~ 是补码运算符,它翻转操作数的位。由于零没有设置位,因此补码将设置所有位,这也是最大大小的整数(假设无符号)。对于带符号的数字,您将得到 -1,因此称其为“max”有点用词不当。
【讨论】:
按位补码。
http://msdn.microsoft.com/en-us/library/d2bd4x66.aspx
文字 0(如上面的代码)是一个 int。
int 是一个 32 位二进制值。值 0 将所有位设置为 0。
~ 运算符是按位恭维。即我交换所有位。
因为所有的位都是 0,所以它们都变成了 1。所以我们有一个 32 位的值
所有位都设置为 1。
C# sharp 使用 2 恭维。它将 int 中的 -1 编码为所有位为 1
0000 0000 0000 0000 0000 0000 0000 0000 == 0
operator ~
1111 1111 1111 1111 1111 1111 1111 1111 == -1
所以 => ~0 == -1
【讨论】:
~ 表示不按位,它反转给定整数中的所有位。在带符号的 int 中,这将为您提供 -1(因为 int 中的所有位都将从 0 翻转到 1。)查找二进制补码以获取有关此二进制补码的更多信息。
在 unsigned int (uint) 中,这将为您提供整数的最大值(因为 unsigned int 中的最高有效位不能确定符号。)
【讨论】:
如前所述,~0 产生 0xFFFFFFFF。
但是,我怀疑原来的程序员很困惑。执行int max = ~0 ; 将有符号整数max 设置为值-1。
【讨论】:
~ 运算符是计算按位补码的一元按位补码运算符。这意味着它将反转其参数中的所有位(0 变为 1,1 变为 0)。因此,
int max = ~0;
将 max 设置为 32 位值 0000 0000 0000 0000 0000 0000 0000 0000 的否定,从而导致 1111 1111 1111 1111 1111 1111 1111 1111。由于我们将此结果存储在Int32 中,因此这与-1 相同。
说得好不好
int max = ~0;
或
int max = -1;
取决于上下文。如果max 的目的是要有一个所有位都是1 的数字,我会选择前者。如果max 的目的是计算非负整数列表的最大值,我会选择后者(好吧,我更喜欢int max = Int32.MinValue;,甚至更喜欢int max = list.Max();) .
【讨论】:
正如其他人所说,~ 是按位否定运算符。它将获取整数值的所有位并切换 0 和 1(0 -> 1 和 1 -> 0)。
对于有符号整数或 Int32,~0 等于 -1。
当您实现某种基于层的过滤系统时,通常使用 ~0 或 -1 作为“全包”掩码(星号),其中您使用默认等于 -1 的“layerMask”参数意味着它将返回任何东西(不过滤)。过滤器确实使用了 AND 操作(valueToFilter & layerMask)。
如果 valueToFilter 也非零,valueToFilter & -1 将始终非零。否则为零。
【讨论】: