Chociaż przyjęta odpowiedź wskazuje, że endianess jest pojęciem z punktu widzenia pamięci. Ale nie sądzę, aby to odpowiadało bezpośrednio na pytanie.
Niektóre odpowiedzi mówią mi, że operacje bitowe nie zależą od endianess , a procesor może reprezentować bajty w inny sposób. W każdym razie, mówi się o tym, że endianess zostaje wyabstrahowany.
Ale kiedy wykonujemy na przykład obliczenia bitowe na papierze, czy nie musimy w pierwszej kolejności podawać endianess? W większości przypadków wybieramy endianinę w sposób pośredni.
Na przykład załóżmy, że mamy taki wiersz kodu
0x1F & 0xEF
Jak obliczysz wynik ręcznie, na papierze?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Więc tutaj używamy formatu Big Endian do wykonania obliczeń. Możesz także użyć Little Endian, aby obliczyć i uzyskać ten sam wynik.
Przy okazji, kiedy piszemy liczby w kodzie, myślę, że jest to format Big Endian. 123456
lub0x1F
większość znaczących liczb zaczyna się od lewej strony.
Ponownie, gdy tylko napiszemy jakiś format binarny wartości na papierze, myślę, że już wybraliśmy Endianess i oglądamy wartość tak, jak widzimy ją z pamięci.
Wracając do pytania, operację przesunięcia <<
należy traktować jako przejście z LSB (najmniej znaczący bajt) do MSB (najbardziej znaczący bajt) .
W takim razie jak na przykład w pytaniu:
numb=1025
Little Endian
LSB 00000001 00000100 00000000 00000000 MSB
Więc << 10
byłoby 10bit
przejście od LSB do MSB.
Porównanie i << 10
operacje dla formatu Little Endian krok po kroku:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
Łał! Otrzymuję oczekiwany wynik zgodnie z opisem PO!
Problemy, których PO nie przyniosła oczekiwanego rezultatu, są następujące:
Wygląda na to, że nie przeszedł z LSB na MSB.
Przesuwając bity w formacie Little Endian, powinieneś zdać sobie sprawę (dzięki Bogu, zdaję sobie z tego sprawę), że:
LSB 10000000 00000000 MSB << 1
jest
LSB 00000000 00000001 MSB
, nie
LSB 01000000 00000000 MSB
Ponieważ dla każdej osoby 8bits
faktycznie piszemy to w plikuMSB 00000000 LSB
Big Endian.
Więc to jest jak
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Podsumowując:
Chociaż mówi się, że operacje bitowe są wyodrębniane z blablablabla ..., kiedy ręcznie obliczamy operacje bitowe, nadal musimy wiedzieć, jakiego endianess używamy, gdy zapisujemy format binarny na papierze. Musimy również upewnić się, że wszyscy operatorzy używają tej samej endianess.
OP nie uzyskał oczekiwanego rezultatu, ponieważ źle wykonał zmianę biegów.