我从未在生活中使用过Bitewise AND。我已经研究过这个算子,但它仍然让我不知道它到底是做什么的。所以,我会问一些我刚刚遇到的代码,Bitwise在做什么:
CASE
WHEN (ft.Receiver_Status & 2) = 2 THEN '3D'
WHEN (ft.Receiver_Status & 1) = 1 THEN '2D'
WHEN (ft.Receiver_Status & 32) = 32 THEN 'Invalid' -- AR 220312
ELSE 'None'
是否强制执行相同的数据类型,例如smallint在比较Receiver_Status的值之前转换为int?
答案 0 :(得分:3)
ft.Receiver_Status & 1
:1是2 0 ,因此它将拉出位置0处的位值。
ft.Receiver_Status & 2
:2是2 1 ,因此它将拉出位置1处的位值。
ft.Receiver_Status & 32
:32是2 5 ,因此它将拉出位置5处的位值。
请注意,例如,= 32
中的(ft.Receiver_Status & 32) = 32
实际上是多余的。这可能是(ft.Receiver_Status & 32) != 0
,因为您感兴趣的是该位是0还是1。
答案 1 :(得分:3)
按位AND检查是否设置了特定位。看起来ft.Receiver_Status
是一个整数,它以不同的位存储各种标志。
1
为00001
,因此ft.Receiver_Status & 1
正在检查是否设置了第一位。2
为00020
,因此ft.Receiver_Status & 1
正在检查第二位是否已设置。32
为10000
,因此ft.Receiver_Status & 32
正在检查第五位是否已设置。为准确了解其工作原理,AND运算的结果将是位置 n 的位为1
f且仅当位置 n <时/ em>在第一个和第二个数字中都是1
。请考虑以下二进制数:
011010001 (209)
000010000 ( 32)
---------------
000010000 ( 32)
另外,
011001001 (201)
000010000 ( 32)
---------------
000000000 ( 0)
答案 2 :(得分:2)
(something & constant) == constant
(其中constant
是2的幂)是确保constant
中定义的位置位的一种方法。考虑你的第一个案例。 2
中的所有位都没有设置,除了第二位,所以我们知道其余的将为零。如果第二位在Receiver_Status
中设置为而不是,那么结果将为零,如果设置,该位将为1,结果将为2,与位掩码相同
它也可以写成(ft.Receiver_Status & 2) > 0
,以避免在每种情况下重复位掩码。
答案 3 :(得分:2)
你应该阅读有关位标志的内容。如果更大的数据类型(例如字节)中的特定位设置为1,那就是检查的方法。
示例:
考虑咬一下以下位内容:00110101
。你想检查第五个位置。您需要将所有其他位更改为0
并检查,如果该位是1
或0
。为此,请使用AND
执行bitewise 2^4
:
00110101
00010000 &
--------
00010000
答案 4 :(得分:1)
为了给出具有所有其他好答案的具体示例,如果Receiver_Flags
为3
,则1
和2
位开启。同样,如果它是34
,则2
和32
位开启。
很多时候enum
用于设置这些字段。考虑一下这个枚举:
public enum Flags
{
ThreeD = 1,
TwoD = 2,
Invalid = 3
}
您可以设置如下值:
Receiver_Flags = Flags.ThreeD | Flags.TwoD
,值为3
。在这种情况下,1
和2
位将打开。
答案 5 :(得分:1)
这与Enum.HasFlag
非常相似。这是实现Test
枚举的一种方法:
static bool HasFlag(Test flags, Test flag)
{
return (flags & flag) != 0;
}
基本上,(ft.Receiver_Status & 32) = 32
会检查第五位是1
还是0
。