Wpis z mikrobloga

#cpp #programowanie

Czy ktoś jest mi w stanie wytłumaczyć co się dzieje pod maską takiego rozwiazania? Zmienna 'flag' jest przypisywana w innym miejscu w kodzie, przed wywołaniem tej metody

long flag;

bool function()
{

char value = flag;

value >>= 7;
return value & 0x01;
}
  • 15
@Lacwik: raczej od 8 bitu, bo przesuwasz o 7 bitów w prawo, czyi tym „na samym końcu” będzie 8 bit. Równie dobrze można by to skrócić do return value & 0x08;.

@KolejnyWykopowyJanusz zwracane jest całe 8 bitów (albo nawet 64 bity, zależy od procesora i sytuacji), tylko zapewniona jest wartość 0 albo 1, bool zajmuje nadal 1 bajt, tylko pozwala w sobie zapisać 0 (false) albo cokolwiek innego (true)
jeżeli liczba byłaby ujemna (właściwie taka jak podajesz) to shr powinien uzupełniać od lewej jedynkami

@that_ugly_dude: Zależy. Może, ale nie musi. Standard mówi:

The value of E1 >> E2 is E1 right-shifted E2 bit positions. (...) If E1 has a signed type and a negative value, the resulting value is implementation-defined.

Kompilator może skompilować >> na liczbach ze znakiem tak samo jak bez znaku i też będzie zgodny ze standardem.
@vytah: zgoda, coś takiego znalazłem: https://c9x.me/x86/html/file_module_x86_id_285.html

The SAR and SHR instructions can be used to perform signed or unsigned division, respectively, of the destination operand by powers of 2. For example, using the SAR instruction to shift a signed integer 1 bit to the right divides the value by 2.


ciekawy jest fragment odnośnie różnic - IDIV zaokrągla do zera (dość naturalnie), za to SAR do -infinity:

Using the SAR instruction