2009-09-21 13 views

Odpowiedz

17

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.

2

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).

1

Jeśli używasz starego kompilatora C, preferowane jest użycie bitowego. Dla czytelności możesz skomentować kod.

22

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.

+0

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

+2

+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). –

6

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ą.

2

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+.

Powiązane problemy