Dlaczego rozmiar bufora pierścieniowego musi wynosić 2?Dlaczego rozmiar bufora pierścieniowego musi wynosić 2?
Odpowiedz
To musi być potęga 2, aby użyć podejścia opisanego poniżej. Nie musi być inaczej.
Typowe podejście wygląda tak: "if (index> = size) {index = size - index;}" (rozmiar 10, indeks 10, wynikowy indeks to 0). Jest to wolniejsze i bardziej podatne na błędy w stosunku do następującego podejścia.
Stosując moc dwóch pozwala nam skorzystać z następujących czynności:
size = 32
bin(size) => '00100000'
mask = size - 1;
bin(mask) => '00011111'
Stosując tę maskę z bitowe i możemy wyizolować tylko bity, które zawierają numery w zakresie od 0 - 31, jak indeks rośnie:
index = 4
bin(4 & mask) => '00000100' (4)
# index 32 wraps. note here that we do no bounds checking,
# no manipulation of the index is necessary. we can simply
# and safely use the result.
index = 32
bin(index & mask) => '00000000' (0)
index = 33
bin(index & mask) => '00000001' (1)
index = 64
bin(index & mask) => '00000000' (0)
index = 65
bin(index & mask) => '00000001' (1)
Takie podejście nie wymaga żadnych porównań, gałęzie, i jest bezpieczny (wynikające indeks zawsze w granicach). Dodatkową zaletą jest to, że nie powoduje utraty informacji; podczas gdy indeks 65 odnosi się do elementu 1, nadal zachowuję informację, że indeks jest logicznie 65 (co jest całkiem przydatne).
Chciałbym również dodać, że to jest tak samo skuteczny, gdy indeks rośnie do 3456237 (adres 13 w buforze), a kiedy nadszedł 3.
Wiem, że późno do partii, ja nie jestem nawet pewien, jak znalazłem to pytanie :-) Mam nadzieję, że to pomaga.
- 1. Optymalny rozmiar bufora Androida:
- 2. błąd suwaka: CICompilerCount 1 jest nieprawidłowy; musi wynosić co najmniej 2
- 3. Przycinanie AudioQueue i rozmiar bufora
- 4. iPhone Max rozmiar bufora gniazda
- 5. Jak zmienić rozmiar bufora i/o jądra
- 6. Czy do stdout dołączono rozmiar bufora?
- 7. Jak znaleźć rozmiar bufora gniazda linux
- 8. Optymalny rozmiar bufora dla strumienia odpowiedzi HttpWebResponse
- 9. Emacs ansi-term maksymalny rozmiar bufora?
- 10. Linux UDP maksymalny rozmiar bufora odbiorczego
- 11. Zwiększ rozmiar bufora SPI w Raspbian
- 12. Golang - Co to jest rozmiar bufora kanału?
- 13. Dlaczego sys.getrefcount() zwraca 2?
- 14. Zarówno zalecany rozmiar bufora dla gniazda i pliku:
- 15. C# FileStream: Optymalny rozmiar bufora do pisania dużych plików?
- 16. dlaczego emplace_back musi przejść konstruktora
- 17. Rozmiar bufora do przechwytywania pakietów w przestrzeni jądra?
- 18. Dlaczego constexpr musi być statyczny?
- 19. Dlaczego BindingResult musi przestrzegać @Valid?
- 20. Stomp nad websocket: Rozmiar bufora wysyłania przekroczony dopuszczalny limit
- 21. laravel Argument 2 musi być tablicą
- 22. C# dlaczego rozmiar obrazu zwiększy rozmiar pliku
- 23. Jak zwiększyć rozmiar bufora przewijania w ekranie GNU
- 24. Jak ustawić rozmiar bufora pod Socket UDP? C#
- 25. Jak ustawić rozmiar bufora kodera utworzonego przez MediaCodec
- 26. Jak poznać rzeczywisty rozmiar zawartości bufora bajtowego w nodejs?
- 27. Maksymalny rozmiar bufora wysyłania/przywracania protokołu Java DatagramPacket (UDP):
- 28. optymalny rozmiar bufora do odczytu pliku w C
- 29. ImageView, dlaczego inny rozmiar?
- 30. Dlaczego 2 == [2] w JavaScript?
Co sprawia, że jesteś tak pewny, że musi to być siła dwóch? –