Dzień dobry,
mam mały kłopot z przesunięciem bitowym na AVR Studio. Otóż w pewnym miejscu programu, chce sprawdzić, czy na n-tym miejscu liczby stoi jedynka czy zero (binarnie). Więc napisałem:
gdzie x zmienia się od 0 do 4, a y od 0 do 6, natomiast wszystkie zmienne i tablice w tym przykładzie są typu uint32_t. Teraz jaki jest problem. Otóż gdy program dochodzi do linijki w której ma nastąpić przesunięcie (wartość zmiennej 'przes' jest poprawnie obliczana) wyłania się dziwny błąd, ponieważ obliczona wartość przesunięcia (zapisana w zmiennej 'potega') jest zawsze równa 0. Najciekawsze jest to, że gdy tę samą liczbę (też jedynkę) przesuwam o tę samą ilość miejsc na Windowsowym kalkulatorze - wynik jest poprawny. Przeniosłem więc program do C++ Builder - tam działa prawidłowo. Napisałem też krótki program w Delphi - też przesuwa prawidłowo.
Wpadłem więc na pomysł napisania komplementarnej funkcji potęgującej liczbę 2 (odpowiednik przesunięcia bitowego w lewo).
No i oczywiście zamiast linijki:
wstawiłem:
Program zaczął działać, tyle, że (co zrozumiałe) dużo wolniej. Kto mi powie co jest grane? Dodam, że optymalizacje kompilatora wyłączyłem!
mam mały kłopot z przesunięciem bitowym na AVR Studio. Otóż w pewnym miejscu programu, chce sprawdzić, czy na n-tym miejscu liczby stoi jedynka czy zero (binarnie). Więc napisałem:
...
przes = szerokosc_matrycy-x-1;
potega = 1<<przes;
if ((Matryca[y]&potega)!=potega)
{
...
gdzie x zmienia się od 0 do 4, a y od 0 do 6, natomiast wszystkie zmienne i tablice w tym przykładzie są typu uint32_t. Teraz jaki jest problem. Otóż gdy program dochodzi do linijki w której ma nastąpić przesunięcie (wartość zmiennej 'przes' jest poprawnie obliczana) wyłania się dziwny błąd, ponieważ obliczona wartość przesunięcia (zapisana w zmiennej 'potega') jest zawsze równa 0. Najciekawsze jest to, że gdy tę samą liczbę (też jedynkę) przesuwam o tę samą ilość miejsc na Windowsowym kalkulatorze - wynik jest poprawny. Przeniosłem więc program do C++ Builder - tam działa prawidłowo. Napisałem też krótki program w Delphi - też przesuwa prawidłowo.
Wpadłem więc na pomysł napisania komplementarnej funkcji potęgującej liczbę 2 (odpowiednik przesunięcia bitowego w lewo).
uint32_t Poteguj2(char x)
{
uint32_t i,wynik;
wynik = 1;
for(i=1;i<=x;i++)
wynik = wynik * 2;
return wynik;
}
No i oczywiście zamiast linijki:
potega = 1<<przes;wstawiłem:
potega = Poteguj2(przes);Program zaczął działać, tyle, że (co zrozumiałe) dużo wolniej. Kto mi powie co jest grane? Dodam, że optymalizacje kompilatora wyłączyłem!
