2012-06-10 20 views
7

Mam bardzo podstawowe pojęcie operatorów bitowych. Nie jestem w stanie zrozumieć, w jaki sposób przypisana jest wartość. Jeśli ktoś wskaże mi właściwy kierunek, będę wdzięczny.W jaki sposób wartość szesnastkowa jest manipulowana bitowo?

Moja Hex Adres: 0xE0074000

wartość dziesiętną: 3758571520

Binary Value: 11100000000001110100000000000000

Próbuję zaprogramować prosty mikrokontroler i korzystać z dostępu Class zarejestrować się w firmie Microsoft. Net Micro Framework, aby kontroler robił to, co chcę.

Register T2IR = new Register(0xE0074000); 
T2IR.Write(1 << 22); 

W powyższym przykładzie, w jaki sposób przenoszone są bity w reprezentacji binarnej? Nie rozumiem, w jaki sposób zarządzanie bitami jest przypisane do adresu w formie binarnej.

Jeśli ktoś wskaże mi właściwy kierunek, będę bardzo wdzięczny.

Odpowiedz

9

Zapomnij o ułamkach dziesiętnych na początek. Wrócisz do tego później.

Najpierw musisz zobaczyć logikę między HEX i BINARY.

Dobra, na bajt masz 8 bitów (# 7-0)

#7 = 0x80 = %1000 0000 
#6 = 0x40 = %0100 0000 
#5 = 0x20 = %0010 0000 
#4 = 0x10 = %0001 0000 

#3 = 0x08 = %0000 1000 
#2 = 0x04 = %0000 0100 
#1 = 0x02 = %0000 0010 
#0 = 0x01 = %0000 0001 

Kiedy przeczytałem, że w binarnym, w bajcie, jak ten jeden% 00001000

to zbiór bitowym , jest czwartym z prawej aka bit # 3, który ma wartość 08 hex (w rzeczywistości również dziesiętny, ale nadal zapomnieć o przecinku, podczas gdy obliczasz hex/binarny)

Teraz, jeśli mamy liczbę binarną% 10000000 To jest bit # 7, który jest włączony. Że ma wartość hex 0x80

Więc wszystko co musisz zrobić, to podsumować je w „przekąski” (każda część bajt szesnastkowy nazywany jest dziobanie przez niektórych maniaków)

maksymalną można uzyskać w bajtu jest (dziesiętnie) 15 lub F jako 0x10 + 0x20 + 0x40 + 0x80 = 0xF0 = binarny% 11110000

więc wszystkie światła na (4 bity) w bajtu = M w heksanie (15 dziesiętnie)

to samo dotyczy niższego skubania.

Czy widzisz wzór?

+0

tak, jak ta część działa, dzięki za wyjaśnienie doskonałe! Więc jeśli mamy wartość 000011001000, a my to zrobimy (8 << 1), to zostawi nam to 000111001000. Czy to prawda? –

+0

Więc jeśli mieliśmy tablicę binarnych 1 i 0, które miały 32 bity i chcieliśmy przesunąć bit 8 na 1, czy moglibyśmy zmodyfikować jedną wartość? np .: bin [7] = 1; ?? –

+0

Idąc dalej, gdybyśmy chcieli to zrobić (8 << 3), byłoby to słuszne: bin [7] = 1; bin [8] = 1; bin [9] = 1; ? –

3

Zobacz odpowiedź @ BerggreenDK na jaką zmianę. Oto kilka informacji o tym, jak to jest na heksie (to samo, tylko inne przedstawienie):

Zmiana jest bardzo prostą koncepcją do zrozumienia. Rejestr ma ustalony rozmiar, a wszelkie bity, które nie pasują, spadają z końca. Więc, weź ten przykład:

int num = 0xffff << 16;

zmiennej w hex będzie teraz 0xffff0000. Zwróć uwagę, że prawy koniec jest wypełniony zerami. Teraz przesuńmy to jeszcze raz.

num = num << 8; 
num = num >> 8; 

num jest teraz 0x00ff0000. Nie odzyskasz swoich starych kawałków. To samo dotyczy prawych zmian.

trick: przesunięcie w lewo o 1 jest jak pomnożenie liczby przez 2, a przesunięcie w prawo o 1 jest jak podzielenie całkowitej wszystko przez 2.

+0

Problem nie znajduje się w operatorze Bitwise. Problem dotyczy klas i sposobu, w jaki klasy przypisują informacje do adresu rejestru. W takim przypadku: Register.SetBits ((3 << 8)); // Manipulowanie bitami w rejestrze ... W jaki sposób zostaną przypisane bity? W jaki sposób rejestr wie, dokąd i jakie fragmenty manipulować? Jeśli wiemy z arkusza danych, że potrzebujemy bitu 3 ustawionego na 1, w jaki sposób opracujemy poprawną operację Bitwise, aby to zrobić? –

+0

URL Link: [Zarejestruj dokumentację klasy] (http://www.ghielectronics.com/downloads/NETMF/Library%20Documentation/html/73f12956-6a7d-d693-6db8-4ec605c50f2d.htm) Link do dokumentacji. Jest krótki i nie daje mi odpowiedzi. –

+0

Ok, A Eureka Moment, Bity o wartości 1 w masce są ustawione w rejestrze. Bity o wartości 0 w masce nie są zmieniane. Musimy więc ustalić wartość binarną, aby ją ustawić, przed przypisaniem jej do rejestru. Więc jeśli chcemy ustawić 0010011 (0) 11 w nawiasach, musimy sparsować plik binarny o wartości 0100, aby ustawić ten BIT! Woohooo w końcu! –