Widziałem to kilka razy, ale wydaje mi się, że użycie przesunięcia bitowego w lewo utrudnia czytelność. Dlaczego jest używany? Czy jest szybsze niż pomnożenie przez 2?Czy jest jakaś korzyść z używania "<< 1" zamiast "* 2"?
Odpowiedz
Jest szybszy w przypadku starych kompilatorów, które nie optymalizują wywołań * 2, wysyłając instrukcję zmiany w lewo. Ta optymalizacja jest naprawdę łatwa do wykrycia, a każdy przyzwoity kompilator już to robi.
Jeśli ma wpływ na czytelność, nie używaj go. Zawsze napisz swój kod w sposób najbardziej przejrzysty i zwięzły, a następnie, jeśli masz problemy z szybkością, wróć do profilu i zrób optymalizacje ręki.
Dla niektórych architektur przesunięcie bitowe jest szybsze niż pomnożenie. Jednak każdy kompilator warty swojej soli zoptymalizuje * 2 (lub dowolne mnożenie przez potęgę 2) do lewego przesunięcia bitowego (kiedy przesunięcie bitowe będzie szybsze).
Jeśli używasz starego kompilatora C, preferowane jest użycie bitowego. Dla czytelności możesz skomentować kod.
Powinieneś używać * podczas pomnażania i < <, gdy zmieniasz bit. Są matematycznie równoważne, ale mają różne znaczenia semantyczne. Jeśli budujesz pole flag, użyj przesunięcia bitów. Jeśli obliczasz sumę, użyj mnożenia.
bardzo dobry punkt. Jeśli chcesz przesunąć bity o jedno miejsce w lewo, użyj '<< 1'. jeśli chcesz zrobić liczbę dwa razy większą, użyj '* 2'. Ten sam efekt, ale o wiele jaśniejszy, do czego używasz tego numeru. – nickf
+1. Wyraź swój ** zamiar ** w kodzie, nie próbuj odgadnąć kompilatora (chyba że wyprofilowałeś kod i ustaliłeś, że robienie tego w taki czy inny sposób powoduje znaczącą różnicę w wydajności). –
Jest używany, gdy interesują Cię poszczególne bity danych, z którymi pracujesz. Na przykład, jeśli chcesz ustawić górny bajt słowa do 0x9A
, byś nie pisać
n |= 0x9A * 256
Można by napisać:
n |= 0x9A << 8
To czyni go bardziej zrozumiałym, że pracujesz z bitów, a nie dane, które reprezentują.
Dla czytelności wartości używanych jako bitfields:
enum Flags { UP = (1<<0),
DOWN = (1<<1),
STRANGE = (1<<2),
CHARM = (1<<3),
...
co moim zdaniem jest korzystne zarówno '= 1, ..., = 2, ... = 4' lub „= 1, .. . = 2, = 2 * 2, ... = 2 * 3 ', szczególnie jeśli masz flagi 8+.
- 1. Czy jest jakaś korzyść z używania wartości null w PHP?
- 2. Czy jest jakaś korzyść z używania Py_DECREF zamiast Py_XDECREF dla rozszerzeń Python C?
- 3. Czy jest jakaś korzyść z używania ogólnego parametru typu odniesienia, jeśli interfejs klasy jest sprzeczny?
- 4. Czy jest jakaś korzyść z używania narzędzia Mapper kontra Implicit Operators?
- 5. Czy jest jakaś realna korzyść z używania metody javascript Array reduce()?
- 6. Czy jest jakaś korzyść z używania AND i OR przez && i || w PHP?
- 7. W kompilacji ScalaJs sbt, czy jest jakaś korzyść używać webjars zamiast npm lub altana z "Provided"?
- 8. Gdzie jest korzyść z używania wzorca strategii?
- 9. Co to jest korzyść z używania Pendżabu
- 10. Jaka jest korzyść z używania "wszystkich" w zapytaniu o media?
- 11. Ocena wyrażenia 1 <= miesiąc <= 12
- 12. JSF 2.0: Czy jest jakaś korzyść w korzystaniu z DataModel <T> na liście <T> dla aplikacji CRUD
- 13. Sprawdź, czy wartość znajduje się w pewnym zakresie, np. 1 <= val <= 2
- 14. Czy istnieje korzyść z używania HtmlHelper w MVC?
- 15. Co robi przekierowanie "2 <i 1" w powłoce Bourne'a?
- 16. Jaka jest korzyść z używania RichTextBox na TextBox?
- 17. Jaka jest korzyść z używania Fragmentów w systemie Android zamiast z widoków?
- 18. Co oznacza typedef enum składniowa, jak "1 << 0"?
- 19. Czy jest jakaś różnica między 1U a 1 w c?
- 20. Jaka jest główna korzyść z używania HashMap w java?
- 21. Czy jest jakaś korzyść z posiadania automatycznie zwiększającego się klucza podstawowego w tabeli przestawnej MySQL?
- 22. unsigned long 0 <-1?
- 23. Czy jest jakaś sztuczka do używania wykresów d3 w jsf?
- 24. Cython: bo od 1 <= i <n
- 25. Jaka jest różnica między << i + =?
- 26. Użyj \ zamiast + lub <<, aby złączyć te ciągi
- 27. Różnica pomiędzy `nazwy (DF) [1] <-` i 'nazwy (DF) [1] <- `
- 28. co to znaczy według typu = 1 << 0?
- 29. <% $, <% @, <% =, <% # ... o co chodzi?
- 30. Jaki jest odpowiednik POSIX powłoki bash <<<
To jest łatwe do sprawdzenia. Po prostu przetestuj to. –
jak? Korzystając z "czasu"? –