Muszę obliczyć bazę logów 2 liczby w C, ale nie mogę korzystać z biblioteki matematycznej. Odpowiedź nie musi być dokładna, tylko do najbliższej int. Zastanawiałem się nad tym i wiem, że mogłem po prostu użyć pętli while i dalej dzielić liczbę przez 2, aż będzie to < 2 i zachować liczbę iteracji, ale czy jest to możliwe za pomocą operatorów bitowych?Jak wykonać komputerową bazę 2 przy użyciu operatorów bitowych?
Odpowiedz
Jeśli policzyć shifting jako operator bitowy, jest to łatwe.
Wiesz już, jak to zrobić przez kolejne dzielenia przez 2.
x >> 1
jest taka sama jak x/2
dla dowolnej liczby całkowitej bez znaku w C
Jeśli musisz zrobić to szybciej, można zrobić "dziel i rządź" - przesuń, powiedzmy, 4 bity naraz, aż osiągniesz 0, a następnie wróć i zobacz ostatnie 4 bity. Oznacza to co najwyżej 16 zmian i 19 porównań zamiast 63 każdego z nich. Niezależnie od tego, czy jest to rzeczywiście szybsze na nowoczesnym procesorze, nie mogłem powiedzieć bez testowania. I możesz zrobić to o krok dalej, najpierw zrobić grupy 16, potem 4, potem 1. Prawdopodobnie nie jest to użyteczne, ale gdybyś miał 1024-bitowe liczby całkowite, może być warte rozważenia.
Dzięki, nie zdawałem sobie sprawy, jak było oczywiste. Rozgryzłem to. – SKLAK
@SKLAK: Dla dodatkowej zabawy spróbuj skompilować kod '/ 2' i' >> 1' za pomocą -O2 i zobacz, jak to się różni. Jeśli jeden jest znacznie szybszy od drugiego, możesz uzyskać ten sam kod dla obu. – abarnert
Będą one takie same dla "unsigned". Dla 'int', istnieje dodatkowa operacja, aby wcześniej dodać bit znaku, co zapewnia, że wynik zaokrągla się w kierunku zera zamiast ujemnej nieskończoności. –
już odpowiedział przez abamert ale po prostu być bardziej konkretne to jak byś go kod:
Log2(x) = result
while (x >>= 1) result++;
- 1. Kilka pytań na temat operatorów bitowych
- 2. jak wykonać współrzędne transformacji afinicznej przy użyciu Pythona? część 2
- 3. Jak wykonać minimalną instalację przy użyciu Bowera
- 4. Jak wykonać pojedyncze logowanie przy użyciu NodeJS?
- 5. Generowanie określonego wzorca bitowego za pomocą operatorów bitowych
- 6. przy użyciu polecenia onDelete z Doctrine 2
- 7. Jak wyczyścić bazę danych, upuszczając wszystkie rekordy przy użyciu sqlalchemy?
- 8. Jak mogę utworzyć bazę danych przy użyciu pymssql
- 9. Dodawanie liczb 64-bitowych przy użyciu arytmetyki 32-bitowej
- 10. Jak wdrożyć aplikację komputerową Python?
- 11. Jak stworzyć bazę danych w doktrynie 2
- 12. Jak wykonać operacje bitowe w glsl
- 13. utworzyć słownik przy użyciu 2 list przy użyciu LINQ
- 14. przy użyciu składników w Cakephp 2+ Shell
- 15. Sprawdzanie, czy liczba jest dodatnia lub ujemna za pomocą operatorów bitowych
- 16. Czy można utworzyć relacyjną bazę danych przy użyciu MongoDB?
- 17. Jak wykonać kwerendę przy użyciu wielu warunków w IndexedDB?
- 18. Jak wykonać polecenie w NodeJS przy użyciu środowiska użytkownika?
- 19. Jak wykonać test integracji ASP.NET MVC przy użyciu selenu
- 20. Jak wykonać uwierzytelnianie na podstawie tokena przy użyciu ServiceStack
- 21. Jak wykonać operację macierzy 8 x 8 przy użyciu SSE?
- 22. Jak wykonać to zapytanie MongoDB przy użyciu java?
- 23. aktualizacja 2 pól przy użyciu linq foreach
- 24. Komponent CakePHP Auth przy użyciu 2 tabel
- 25. Połączyć 2 pliki AAC przy użyciu Java
- 26. wyjaśnić zachowanie 1-bitowych bitowych pól
- 27. Jak wykonać testy Selenium 2 w Jenkinsach
- 28. Jak obsługiwać wgrane pliki w Play! 2 przy użyciu Scala?
- 29. jak sprawdzić, czy 2 pliki są równe przy użyciu .NET?
- 30. Jak utworzyć TreeView w Angular 2 przy użyciu maszynopisu?
Czy liczysz [przesunięcie] (http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts) jako operator bitowy? Jeśli tak, odpowiedź jest dość oczywista. Jeśli nie, to jest trudniejsze. – abarnert
0_o Dlaczego nie możesz skorzystać z biblioteki matematycznej? –
@JackManey: Prawdopodobnie jest to zadanie domowe lub samouczący odpowiednik. Ale to w porządku; wydaje się, że włożył w to trochę wysiłku (zawsze ma rozwiązanie robocze) i szuka wskazówek, czy istnieje inny sposób, aby to zrobić, nie prosząc nas, abyśmy zrobili dla niego swoją pracę domową. – abarnert