• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ cyklicznie przesunięcie bitów zadanie

Object Storage Arubacloud
0 głosów
769 wizyt
pytanie zadane 20 kwietnia 2020 w C i C++ przez p4wix Obywatel (1,040 p.)
zamknięte 20 kwietnia 2020 przez p4wix

Cześć mam problem z zadaniem dotyczącym cyklicznego przesunięcia bitów na wejście podajemy liczbę na której będziemy dokonywać przesunięcia i ilość bitów o ile daną liczbę chcemy przesunąć. Na tyle na ile umiem postarałem się wykonać jakaś analizę i wyszło mi ze w miejscu gdzie powinny wychodzić zera z lewej strony przy przesunięciu w prawo wychodzą nieoczekiwane jedynki dlaczego tak się dzieje? I co mógłbym poprawić aby kod działał?

Zakładając że dla liczby -10 przesuniętej o 3 w prawo wychodzi: -536870914

int bitwise_rotation(int value, int k) {
	//liczba -10 = 1111 1111 1111 1111 1111 1111 1111 0110‬
	//zadładamy zakładamy przesunięcie o 3 miejsca w prawo

	//napierw w lewo o (bit_size(vvalue) - k) aby ustawić jakby na wartości końcowej stronne bitów lewą
	int tmp1, tmp2, result, size = sizeof(int) * 8;
	tmp1 = value << (size - k);

	//tmp1 = 1100 0000 0000 0000 0000 0000 0000 0000
	//teraz w prawo do zmienniej tmp2(o ilośc przeuwanych bitów niejako usunąc te po prawej)
	tmp2 = value >> k;

	/*
		Dlaczego ‭1111 1111 1111 1111 1111 1111 1111 1110‬
		a nie 0001 1111 1111 1111 1111 1111 1111 1110
	*/

	result = (tmp1 bitor tmp2);

	return result;
}

Z góry dzięki za wszelkie odpowiedzi

komentarz zamknięcia: Otrzymałem odpowiedz na moje pytanie
komentarz 20 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)
Z ciekawości dopytam, -10 to Twój wymysł, czy autor zadania tak postanowił?
komentarz 20 kwietnia 2020 przez p4wix Obywatel (1,040 p.)
autora zadania, bo generalnie z tego próbowałem to dla dodatnich działa bez zarzutu
komentarz 20 kwietnia 2020 przez tkz Nałogowiec (42,000 p.)

Jako uzupełnienie odpowiedzi dodam https://stackoverflow.com/questions/8415895/is-left-and-right-shifting-negative-integers-defined-behavior odpowiedz supercat powinna rozwiać wątpliwości. 

komentarz 20 kwietnia 2020 przez p4wix Obywatel (1,040 p.)
Dzięki program ostatecznie zadziałał rzeczywiście ten post rozwiał i na pewno wyjaśnił mi wiele w tym dość nieprzewidywalnym ale i ciekawym temacie :D

1 odpowiedź

0 głosów
odpowiedź 20 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 20 kwietnia 2020 przez p4wix
 
Najlepsza

Zaciekawiło mnie twoje pytanie. Szybko sprawdziłem i widzę wyniki których nie oczekiwałem.
Po chwili googlowania wpadłem na wikipedię

Shifts can result in implementation-defined behavior or undefined behavior, so care must be taken when using them. The result of shifting by a bit count greater than or equal to the word's size is undefined behavior in C and C++.[2][3] Right-shifting a negative value is implementation-defined and not recommended by good coding practice;[4] the result of left-shifting a signed value is undefined if the result cannot be represented in the result type.[2]

Proponuję ci rzutować liczbę na unsigned int, wykonać przesunięcia i przekonwertować liczbę spowrotem na int,

 

komentarz 20 kwietnia 2020 przez p4wix Obywatel (1,040 p.)
	static_cast<unsigned int>(value);
	tmp2 = value >> k;
	static_cast<int>(value);

jeżeli masz na myśli coś takiego to niestety też tmp2 jest -2, tmp2 tez próbowałem rzutować a także oba naraz tak samo -2, co ciekawe jak zadeklarowałem tmp2 jako unsigned to przyjmuje wartość 4 294 967 294 ,  1111 1111 1111 1111 1111 1111 1111 1110‬ czyli tez wchodzą jedynki 

komentarz 20 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Wynik rzutowania musisz przypisać do zmiennej.

auto unsigned_value = static_cast<unsigned int>(value);
tmp2 = unsigned_value >> k;
value = static_cast<int>(tmp2);

I przykład użycia

#include <iostream>
#include <bitset>

using namespace std;

template <typename T>
void print (const T &t) {
    bitset <sizeof(T)*8> b(t);
    cout << t << ": " << b.to_string() << endl;
}

int main()
{
    int value = -1;
    print(value);
    auto unsigned_value = static_cast<unsigned int>(value);
    print(unsigned_value);
    auto tmp2 = unsigned_value >> 1;
    print(tmp2);
    value = static_cast<int>(tmp2);
    print(value);

    return 0;
}

 

komentarz 20 kwietnia 2020 przez p4wix Obywatel (1,040 p.)

Czyli kluczowe było to rzutowanie. Dzięki!

zadziałało mi ze static castami i starym sposobem też..

tmp2 = (unsigned)value >> k;

 

Podobne pytania

0 głosów
4 odpowiedzi 1,112 wizyt
pytanie zadane 5 października 2018 w Java przez Potopiec Obywatel (1,550 p.)
+1 głos
1 odpowiedź 1,782 wizyt
pytanie zadane 11 stycznia 2016 w C i C++ przez robert9620 Stary wyjadacz (11,640 p.)
0 głosów
1 odpowiedź 255 wizyt
pytanie zadane 17 czerwca 2022 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...