什么是Bitwise和在这做什么

时间:2013-11-12 18:40:08

标签: sql bitwise-operators boolean-operations

我从未在生活中使用过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?

6 个答案:

答案 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是一个整数,它以不同的位存储各种标志。

    二进制文件中的
  • 100001,因此ft.Receiver_Status & 1正在检查是否设置了第一位。
  • 二进制文件中的
  • 200020,因此ft.Receiver_Status & 1正在检查第二位是否已设置。
  • 二进制文件中的
  • 3210000,因此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并检查,如果该位是10。为此,请使用AND执行bitewise 2^4

00110101
00010000 &
--------
00010000

答案 4 :(得分:1)

为了给出具有所有其他好答案的具体示例,如果Receiver_Flags3,则12位开启。同样,如果它是34,则232位开启。

很多时候enum用于设置这些字段。考虑一下这个枚举:

public enum Flags
{
    ThreeD = 1,
    TwoD = 2,
    Invalid = 3
}

您可以设置如下值:

Receiver_Flags = Flags.ThreeD | Flags.TwoD

,值为3。在这种情况下,12位将打开。

答案 5 :(得分:1)

这与Enum.HasFlag非常相似。这是实现Test枚举的一种方法:

static bool HasFlag(Test flags, Test flag)
{
    return (flags & flag) != 0;
}

基本上,(ft.Receiver_Status & 32) = 32会检查第五位是1还是0