Operatory bitowe i " endianess"

Czy endianness ma w ogóle znaczenie przy operacjach bitowych? Albo Logiczne czy przesunięcie?

Pracuję nad pracą domową w odniesieniu do operatorów bitowych, i nie mogę zrobić głowy lub ogony na tym, i myślę, że jestem coraz bardziej zawieszony na endianess. Oznacza to, że używam trochę endian maszyny (jak większość są), ale czy to musi być brane pod uwagę, czy jest to zmarnowany fakt?

W razie potrzeby używam C.

Author: Community, 2009-06-25

5 answers

Endianness ma znaczenie tylko dla układu danych w pamięci. Gdy tylko dane są ładowane przez procesor, na którym mają być obsługiwane, endianness jest całkowicie nieistotny. Przesunięcia, operacje bitowe itd. działają tak, jak można się spodziewać (dane logicznie ułożone jako bit niskiego rzędu do wysokiego) niezależnie od endianness.

 66
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-25 00:04:20

Operatory bitowe oddalają endianess. Na przykład operator >> zawsze przesuwa bity w kierunku najmniej znaczącej cyfry. Nie oznacza to jednak, że możesz całkowicie ignorować endianness podczas ich używania, na przykład gdy masz do czynienia z pojedynczymi bajtami w większej strukturze, nie zawsze możesz zakładać, że spadną one w tym samym miejscu.

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

Aby wyjaśnić, nie jestem w podstawowym sprzeczności z innymi odpowiedziami tutaj. Chodzi mi o to, żeby należy podkreślić, że chociaż operatory bitowe są zasadniczo neutralne endianowo, nie można ignorować efektu endianess w kodzie, zwłaszcza w połączeniu z innymi operatorami.

 60
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 21:51:24

Jak wspomnieli inni, przesunięcia są zdefiniowane przez specyfikację języka C i są niezależne od endianess, ale implementacja przesunięcia prawego może się różnić w zależności od iff Architektura używa jednego dopełniacza lub dwóch dopełniacza arytmetyki.

 4
Author: rpetrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-25 00:10:20

To zależy. Bez odlewania liczby w nowy typ, można traktować endianness przejrzyście.

Jeśli jednak Twoja operacja wymaga nowego odlewu, zachowaj ostrożność.

Na przykład, jeśli chcesz prawy przesuń niektóre bity i oddaj (jawnie lub nie) do nowego typu, endianness ma znaczenie!

Aby sprawdzić swoją endianness, możesz po prostu wrzucić int do char:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);
 2
Author: Rongkai Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-25 12:08:08

Nie określiłeś języka, ale zazwyczaj języki programowania takie jak C abstrakcyjne endianness away w operacjach bitowych. Więc nie, to nie ma znaczenia w operacjach bitowych.

 1
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 23:57:28