“值”从0到15 (它的可能值)。这4个“如果”条件何时才能得到满足?如果我的(Int)值=2,这是否意味着0010?
if ((int)value & 0x1)
{
//statement here
}
if ((int)value & 0x2)
{
//statement here
}
if ((int)value & 0x4)
{
//statement here
}
if ((int)value & 0x8)
{
//statement here
}
发布于 2014-07-02 10:51:40
每个数字可以表示为value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
,每个b要么是0
,要么是1
(这些是表示的位)。这是二进制表示。
二进制和(&
)明智地接收每个b
对,并对它们执行和执行。这方面的产出如下:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
使用2的幂(只有一位),我们可以隔离和测试各个位:
value & 1
为奇数{1,3,5,7,9,11,13,15}时,value
为真。value & 2
为奇数{2,3,6,7,10,11,14 ,15}时,value/2
为真。value & 4
为奇数{4,5,6,7,12,13,14 ,15}时,value/4
为真。value & 8
是奇数{8,9,10,11,12,13,14 ,15}时,value/8
为真。数字上的0x prefex意味着它应该被解释为十六进制数。当您只使用0x8但告诉维护人员它可能被用作位掩码时,它就有点多余了。
发布于 2014-07-02 13:13:28
这些if语句检查是否设置了特定的value
位。
例如,十六进制值0x4
的第三个位从右设置为1
,所有其他位设置为0
。当您使用带有两个操作项的二进制和操作符(&
)时,结果将将所有位设置为0
,除了在这两个操作项中为1的位。
因此,在计算value & 0x4
时,您可以得到二进制00000000
或二进制00000100
,这取决于value
的第三位是1
还是0
。第一个计算结果为false
,第二个计算值为true
,因此if-块只对设置了第3位的值执行。
发布于 2014-07-02 14:18:00
这里有两件有趣的事情要注意。
首先,这是一个用于检查积分值的每一个低阶4位的通用模式。如果设置了相应的位,则满足if条件。对于值2,位模式确实是0010。
另一个更有趣的问题是为什么会出现(int)
?除了在C++中使用C-类型的糟糕样式之外,没有任何整数或字符值需要这种转换。bool没有任何意义,双重/浮点数将被转换为一个临时整数,使用文字值来测试枚举是很不寻常的。用指针可能是有意义的,但这将是一个非常特殊的用途。结论:石膏没有任何意义。
https://softwareengineering.stackexchange.com/questions/246639
复制相似问题