1

在我的生活中,我从未使用过 Bitewise AND。我已经研究过这个运算符,但我仍然不知道它到底做了什么。所以,我会用我刚刚遇到的一些代码来问,Bitwise And 在这里做什么:

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'

它是否强制执行相同的数据类型,例如在比较 Receiver_Status 的值之前将 smallint 转换为 int?

4

6 回答 6

3

按位与检查是否设置了特定位。它似乎ft.Receiver_Status是一个整数,它将各种标志存储在不同的位中。

  • 1在二进制中也是00001如此ft.Receiver_Status & 1,检查是否设置了第一位。
  • 2在二进制中00020ft.Receiver_Status & 1检查是否设置了第二位。
  • 32在二进制中10000ft.Receiver_Status & 32检查是否设置了第五位。

为了准确了解它是如何工作的,AND 运算的结果将是位置n处的位将为1f,并且仅当第一个和第二个数字中位置n1处的位为 时。考虑以下二进制数:

011010001 (209)
000010000 ( 32)
---------------
000010000 ( 32)

或者,

011001001 (201)
000010000 ( 32)
---------------
000000000 (  0)
于 2013-11-12T18:43:31.887 回答
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 的位的值。

请注意,例如,= 32in(ft.Receiver_Status & 32) = 32实际上是多余的。这可能是(ft.Receiver_Status & 32) != 0因为您只关心该位是 0 还是 1。

于 2013-11-12T18:42:48.400 回答
2

(something & constant) == constant(其中constant是 2 的幂)是一种确保constant设置中定义的位的方法。考虑你的第一个案例。除了第二位之外,所有位2都没有设置,所以我们知道其余的都是零。如果第二位设置,Receiver_Status则结果将为零,如果设置,则该位将为 1,结果将为 2,与位掩码相同。

它也可以写成(ft.Receiver_Status & 2) > 0避免在每种情况下重复位掩码。

于 2013-11-12T18:43:09.480 回答
2

您应该阅读有关位标志的信息。这是检查较大数据类型(例如字节)中的特定位是否设置为 1 的方法。

例子:

考虑咬一口以下内容:00110101. 你想检查第五个位置。您需要将所有其他位更改为0并检查该位是否为10。为此,请使用以下命令逐位AND执行2^4

00110101
00010000 &
--------
00010000
于 2013-11-12T18:43:38.753 回答
1

举一个具有所有其他出色答案的具体示例,如果Receiver_Flags3,则12位已打开。同样,如果是34,则232位打开。

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

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

您可以像这样设置值:

Receiver_Flags = Flags.ThreeD | Flags.TwoD

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

于 2013-11-12T18:44:49.390 回答
1

这与Enum.HasFlag. Test这是为枚举实现它的一种方法:

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

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

于 2013-11-12T18:45:00.790 回答