Przesunięcie w prawo oznacza przemieszczenie wszystkich bitów argumentu w prawo o określoną liczbę miejsc oraz powielenie najstarszego bitu na skrajnej lewej pozycji.
Jednak następujący kod:
#include #include using namespace std; int main() { unsigned char x = 255; cout<(x)<<"\n"; cout<(x<<1)<<"\n"; cout<(x>>1)<<"\n"; return 0; } Daje następujące wyniki: 11111111 11111110 01111111 A według podręcznika powinien on pokazać: 11111111 11111110 11111111 Zamiast powielić najstarszy bit, w trzeciej linijce, na skrajnej lewej pozycji zostało wypisane 0, zamiast 1. Więc jak to jest z tymi przesunięciami bitowymi? Ich wynik zależy od platformy sprzętowej, mój tok rozumowania jest zły czy w podręczniku jest błąd? #c #cpp #programowanie #pytanie
@AwizisieAkat: @arkadiusz97 Jeżeli przesuwana w prawo jest negatywna wartość typu całkowitoliczbowego to zachowanie jest "implementation-defined". (6.5.7 5)
To czy char jest ze znakiem czy bez również jest "implementation-defined". (6.2.5 3)
@arkadiusz97: tak jak u góry ktoś napisał, liczba, która jest powielana w przesunięciu ma taką samą wartość jak bit znakowy, np: a) 1.01101 -> 1.101101 b) 0.11011 -> 0.011011
liczba przed kropką oznacza bit znakowy (1 - liczba ujemna, 0 - liczba dodatnia)
@arkadiusz97: jest jak najbardziej dobrze, to Ty źle zrozumiales
po pierwsze jest roznica miedzy shiftem ( SHL/SHR ) a rollem ( ROL/ROR ), jedno przesuwa bit na drugi koniec, drugie tylko zeruje. Ty tutaj robisz ewidentnie robisz operacje bez przesuwania na koniec, wiec po shifcie w lewo straciles jeden bit informacji, a po powrocie ze wzgledu na brak bitu na poczatku wstawiono zero
Jednak następujący kod:
#include#include
using namespace std;
int main()
{
unsigned char x = 255;
cout<(x)<<"\n";
cout<(x<<1)<<"\n";
cout<(x>>1)<<"\n";
return 0;
}
Daje następujące wyniki:
11111111
11111110
01111111
A według podręcznika powinien on pokazać:
11111111
11111110
11111111
Zamiast powielić najstarszy bit, w trzeciej linijce, na skrajnej lewej pozycji zostało wypisane 0, zamiast 1.
Więc jak to jest z tymi przesunięciami bitowymi? Ich wynik zależy od platformy sprzętowej, mój tok rozumowania jest zły czy w podręczniku jest błąd?
#c #cpp #programowanie #pytanie
@arkadiusz97
Jeżeli przesuwana w prawo jest negatywna wartość typu całkowitoliczbowego to zachowanie jest "implementation-defined". (6.5.7 5)
To czy char jest ze znakiem czy bez również jest "implementation-defined". (6.2.5 3)
źródło: comment_ctKiVV6zr1IMPs3j7r3cLyUe22mUdWxi.jpg
Pobierza) 1.01101 -> 1.101101
b) 0.11011 -> 0.011011
liczba przed kropką oznacza bit znakowy (1 - liczba ujemna, 0 - liczba dodatnia)
po pierwsze jest roznica miedzy shiftem ( SHL/SHR ) a rollem ( ROL/ROR ), jedno przesuwa bit na drugi koniec, drugie tylko zeruje. Ty tutaj robisz ewidentnie robisz operacje bez przesuwania na koniec, wiec po shifcie w lewo straciles jeden bit informacji, a po powrocie ze wzgledu na brak bitu na poczatku wstawiono zero