2013-11-01 3 views
0

Я не совсем понимаю разницу между побитовой операцией и логической операцией. Пожалуйста, обратитесь к операции побитовое ниже:Логическая ошибка путаницы

х = 7 и 15

Я понимаю, что х будет равен 7 в этом случае после проверки каждого бита индивидуально.

Как логическая логика работает на более низком уровне. Я считаю, что Boolean - это 32-битный тип данных (я мог ошибаться). Булевы литералы (TRUE и FALSE) рассматриваются как единичные биты?

+1

Как 'boolean' представляется в памяти, является« деталью реализации ». Это означает, что а) не для программиста, о котором нужно заботиться, и б) он может измениться, если MS подумает, что это имеет смысл. – igrimpe

+0

@igrimpe, я пытаюсь понять, если все WORD обрабатывается как один бит в случае логической логики. – w0051977

+0

Если вы конвертируете любое число в boolean в VB.Net, это правило: Если оно равно 0, результат будет ложным. Иначе это правда. Если вы конвертируете логическое значение в int (например), ситуация усложняется. false будет давать 0, но значение true может быть 1 или -1 в зависимости от используемого метода преобразования. Самый большой источник путаницы в VB.Net imho: логические и побитовые операторы кажутся «одинаковыми» (другие языки имеют разные операторы, но VB имеет довольно «историю»). – igrimpe

ответ

0

Как правило, это работает.

Побитовые операции выполняют булевы операции над битами, представляющими их операнды. Логические операции - это логические операции, выполняемые на булевых множествах, обычно TRUE и FALSE или 1 и 0. Булевским множеством может быть любая группа отдельных элементов, где общее количество элементов набора равно 2.

В случае выполнения побитового AND на операндах 7 и 15: если используемая вами система представляет их как прямые двоичные числа без каких-либо странных смещений, тогда 7 становится 0111 в двоичном коде, 15 становится 1111 в двоичном формате. Ведущее значение 0 в двоичном формате 7 необязательно, поскольку оно равнозначно тому, как добавление нуля к любому десятичному числу: 10 = 010 = 000000000000010, но проще проиллюстрировать операцию с начальным нулем.

0111 7 in binary 
1111 15 in binary 
&&&& bitwise AND 
0111 results in 7 

, если true и false представлены в виде двоичной 1 и 0, то нет никакой разницы между «логическим» and и «поразрядными» and операций.

1 true as binary 1 
0 false as binary 0 
& either logical or bitwise AND 
0 results in binary 0 

попытка побитовое and на некоторых других чисел, как, скажем, 1 и 2

01 1 in binary 
10 2 in binary 
&& bitwise and 
00 results in binary 0 

Предполагая, что любое число, кроме 0, будут преобразованы в true, выполняя «логический» and на номера 1 и 2 приведет к другому результату

1 the number 1 converted to true and represented as boolean 1 
1 the number 2 converted to true and represented as boolean 1 
& logical and 
1 results in true, here represented as binary 1 

При выполнении побитовых операций с использованием поплавков, отрицательных чисел или основных иначе, чем положительные целые числа, вы можете получить радикально разные результаты. Это связано с различными средами, использующими разные методы для хранения чисел в памяти.Конечно, все это двоично, но числовая строка не всегда сосредоточена на двоичном нуле, и не всегда бывает, что каждый бит представляет собой часть числа; некоторые из битов могут представлять знак числа или экспонента. Вам нужно будет выкопать детали реализации, если вы хотите просто подставить десятичные числа в побитовые операции. С этим проще справиться, если у вас есть метод преобразования чисел в двоичный, потому что тогда вы точно знаете бит и их порядок, и вы сможете проверить, соответствуют ли ваши ожидания вашим результатам.

1

Не делайте никаких предположений о внутренней структуре булева. На многих языках (например, C, C++) bool внутренне представляется как int и все, за исключением того, что значение 0 интерпретируется как true. Но это зависит от зависимости и может изменяться между компиляторами и даже версиями компилятора. В современных языках, таких как java или C#, (эквивалент) вышеупомянутый оператор даже не компилируется, потому что int не может быть неявно передан в bool.

Если вам действительно нужна побитовая операция, инструкция, конечно, действительна, значение x будет равно 7 (так как это побитовое и 7 и 15), но чтобы преобразовать это в булево, было бы разумно сделайте это явно, т.е. if (x != 0) then... или bool xb = x != 0. Это может помочь избежать путаницы с читателем вашего кода, а также ясно, что вам известно о том, что вы сейчас делаете преобразование типа.

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