2013-11-12 2 views
1

Я никогда не использовал Bitewise И в своей жизни. Я исследовал этого оператора, но он все же ускользает от меня относительно того, что он точно делает. Итак, я спрошу с некоторым кодом, я просто наткнулся на то, что это побитовое И здесь делает:Что такое Bituteise и делает здесь

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?

+2

Знаете ли вы, что такое двоичное число? – elyashiv

+6

Как это относится к C# конкретно? –

+0

См. Http://stackoverflow.com/questions/1584122/c-sharp-c-using-bitwise-operators для C# -центрического объяснения, почему вы можете использовать логическую арифметику. – Olly

ответ

3

ft.Receiver_Status & 1: 1 2 , поэтому вытаскивает значение бита в позиции 0.

ft.Receiver_Status & 2: 2 2 , поэтому он вытаскивает значение бита в положении 1.

ft.Receiver_Status & 32: 32 2 , поэтому он вытаскивает значение бита в позиции 5.

Следует отметить, что, например, = 32 в (ft.Receiver_Status & 32) = 32 фактически является избыточным. Это может быть вместо этого (ft.Receiver_Status & 32) != 0, потому что все вы заинтересованы в том, что ли бит равен 0 или 1.

2

(something & constant) == constant (где constant является степенью двойки) является одним из способов обеспечения того, что бит определено в constant установлен , Рассмотрим свой первый случай. Все биты в 2 не установлены, кроме второго бита, поэтому мы знаем, что остальное будет равно нулю. Если второй бит равен , а не, установленному в Receiver_Status, тогда результат будет равен нулю, если он установлен, этот бит будет одним, а результат будет равен двум, так же как и бит-маска.

Это также может быть указано как (ft.Receiver_Status & 2) > 0, чтобы избежать повторения бит-маски в каждом случае.

3

Побитовое И проверяет, установлен ли конкретный бит. Похоже, ft.Receiver_Status - целое число, которое хранит различные флаги в разных битах.

  • 1 в двоичном виде 00001 так ft.Receiver_Status & 1 проверяет, чтобы увидеть, если первый бит установлен.
  • 2 в двоичном коде 00020 поэтому ft.Receiver_Status & 1 проверяет, установлен ли второй бит.
  • 32 in binary is 10000, так ft.Receiver_Status & 32 проверяет, установлен ли пятый бит.

Чтобы увидеть, как именно это работает, результат операции И будет бит в позиции п будет 1 е и только если бит в положении п как в первом и втором номере есть 1. Рассмотрим следующие двоичные числа:

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

И в качестве альтернативы,

011001001 (201) 
000010000 (32) 
--------------- 
000000000 ( 0) 
+0

Жесткий, чтобы принять только один ответ здесь, большое спасибо за информацию и помог мне понять оператора Bitewise и то, как он используется в моем sql-фрагменте. –

2

Вы должны прочитать о битовых флагов. Это способ проверки, если конкретный бит в большем типе данных (например, байт) установлен в 1 или нет.

Пример:

Рассмотрите наличие укуса с содержанием следующих бит: 00110101. Вы хотите проверить пятую позицию. Вам нужно изменить все остальные биты на 0 и проверить, есть ли это 1 или 0. Чтобы сделать это, выполните bitewise AND с 2^4:

00110101 
00010000 & 
-------- 
00010000 
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 будет включен.

1

Это очень похоже на Enum.HasFlag. Вот один из способов осуществить это для Test перечисления:

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

В принципе, (ft.Receiver_Status & 32) = 32 проверяет, является ли пятый бит 1 или 0.

Смежные вопросы