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
@lajdak: przesuwanie bitowe rozumiem, bardziej chodzi mi o to że do chara przypisuje longa a dalej zwracam to jako boola. No i nie rozumiem samego returna
@Lacwik: jak do chara przypisujesz longa, to powinno się przypisać jego najmłodsze 8 bitów. Tak samo przy zwracaniu chara jako boola - zwraca się jeden bit
@Lacwik: Niejawna konwersja typów: – value = flag konwertuje long na char – value >>=7 konwertuje char na int i z powrotem – value & 0x01 konwertuje char na int – return konwertuje int na bool
@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)
@legolass: wynik oczywiście podajesz poprawny, ale kroki chyba nie do końca: jeżeli liczba byłaby ujemna (właściwie taka jak podajesz) to shr powinien uzupełniać od lewej jedynkami
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.
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:
No i okazało się że prowokatorzy z wczoraj to policjanci, Tusk wrócił do władzy to wróciły stare metody na radzenie sobie z protestami, witamy w uśmiechniętej Polsce. #protest #polityka #sejm #rolnictwo #neuropa #policja
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;
}
Komentarz usunięty przez autora
– value = flag konwertuje long na char
– value >>=7 konwertuje char na int i z powrotem
– value & 0x01 konwertuje char na int
– return konwertuje int na bool
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)
Masz jakąś zmienną typu long: np. 1111000110
char value = flag
-> zostaje 11000110value >>= 7
-> zostaje 00000001'value & 0x01` -> zostaje 1
@KolejnyWykopowyJanusz: Najmłodsze CHAR_BIT bitów. Zależy jak duży jest char.
@that_ugly_dude: Zależy. Może, ale nie musi. Standard mówi:
Kompilator może skompilować >> na liczbach ze znakiem tak samo jak bez znaku i też będzie zgodny ze standardem.
ciekawy jest fragment odnośnie różnic - IDIV zaokrągla do zera (dość naturalnie), za to SAR do -infinity: