Uzyskanie czesci jednosci a przesuniecia bitowe.

0

Witam,
Zaczne od tego, ze watek ten umiescilem tutaj bo wydaje mi sie bardziej odpowiedni niz Newbie.
Sprawa wyglada tak, ze mam takie zadnako zeby z liczby wyciagnac czesc jednosci np. z 32 osiagnac 2.
Mozna to uzyskac poprzez reszte z dzielenia przez 10, ale to wydaje mi sie zbyt trywialne. :)
Zastanawiam sie, czy operujac na bitach daloby sie cos takiego zrobic ?
Moim pomyslem bylo uzycie maski 11110000 (ostatnie 8 bitow) zeby wyciagnac 4 bity w ktorych sa przechowywane liczby od 0 - 15. Niestety nie jest to takie proste jak myslalem bo problem sprawia np. liczba 270 tj. 10000 1110 po uzyciu mojej maski otrzymuje 0000 1110 co jest liczba 14. Wiec niestety moja maska jest zla, albo operacje jakie wykonuje.
Ma ktos moze pomysl jak to rozwiazac, albo moze ta reszta z dzialenie jest na tyle szybka, ze moze nie wart tracic czasu na inne rozwiazania ?

2

Reszta z dzielenia jest tak samo wolna jak i samo dzielenie.
Reszty z dzielenia poprzez coś innego niż potęga dwójki nie uzyskasz za pomocą operacji bitowych, ale mnożenie już tak, np x*10 = (x<<3)|(x<<1) z resztą z tej formuły widać że nie da się osiągnąć tego co chcesz.

0

Ja to bym zrobił tak, zamienił liczbę int (bo rozumiem, że liczba jest zawsze całkowita) na std::string, następnie do nowej zmiennej zapisał tylko ostatni znak (liczbę) a następnie zamienił tego stringa na wartość liczbą (int). Piszę odnośnie C++.

0

Moim zdaniem już sama zamiana liczby na napis wymaga wykonania wielu dzieleń i modulo.

Jeżeli szukasz najszybszego sposobu, to wydaje się, że najlepiej już pozostać przy dzieleniu i modulo.

0

Da się zrealizować dzielenie/resztę z dzielenia za pomocą dwóch przesunięć bitowych, mnożenia i dodawania. Kiedyś to było o wiele szybsze od dzielenia, na nowych procesorach już nie jest. W zależności od flag optymalizacyjnych każdy kompilator potrafi to wygenerować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1