Bitwise problem


1
Здравейте! Очевидно не съм овладял добре побитовите операции имам един въпрос.
static void Main() { int num = 2; int digit = num & (1 << 1); Console.WriteLine(digit); }
И при мен се изписва : 2.
По каква причина отговора е 2? и как да взема digit-а от позиция 1, който би трябвало да е 1, а не 2.Аз ли бъркам някъде с кода или с разбирането на операциите.



Отговори



1
Ами ето какво се случва стъпка по стъпка:
2 = 10 в двоична система
1 << 1 = 10 в двоична система (т.е. 2 в десетична бройна система)
10 & 10 = 10 в двоична система (което също е 2 в десетична).
До тук добре, остава само да върнеш бита на нулева позиция за да провериш дали е 1-ца или нула.

от gallumbits (2371 точки)


0
т.е. digit = (digit >> 1) & 1; ConsoleWrite(digit);
Това ли е идеята? Всъщност има ли опция директно да отпечатам бита дали е 1-ца или 0? или просто да проверявам if digit !=0 ConsoleWrite(1);

от GoShow (69 точки)

0
Даже няма смисъл и да проверяваш, ако бита е 1 като отпечаташ пак ще е 1, ако бита е 0 съответно ще си се отпечата пак 0.

от lnxslackware (416 точки)



1

int digit = num & (1 << 1);

Тук преместваш една единица на първата позиция. Съответно digit става 10 & 10, което е отново 10. В резултат digit е по-голямо от 0(защото е 2), което значи, че на съответната позиция имаш единица.

Ако нямаше изместване щеше да стане 10 & 01, което е 00 и показва, че на нулевата позиция имаш нула.


от Burned (12 точки)


0
Добре, явно аз не схващам.Значи 2 е 10 в двоична система.Как да взема 1-цата, която е на първа позиция и да я отпечатам?

от GoShow (69 точки)

0
Да вземем някое по-голямо число за пример.
10011011 (2) = 155 (10)
Искаме да разберем какъв е бита на петата позиция(като започнем да броим от 1). Какво правим:
Вземаме една единица и я преместваме побитово на петата позиция - 1 << 4 и получаваме 10000
Сега умножаваме двете числа(Логическо И &):
10011011 & 00010000 ------------- 00010000
Полученият резултат е 00010000 (2) = 16 (10) и 16 е по-голямо от 0, съответно бита с позиция 5 в числото 155 е единица.
if(digit != 0) Console.WriteLine(1); или отместваш digit със съответното отместване, но в обратната посока и ще получиш направо единицата.
Да вземем същия пример, но с бита на трета позиция:
10011011 & 00000100 ------------- 00000000
Това очевидно е 0, съответно на тази трета позиция бита е нула.

от Burned (12 точки)