Czy bit przesuwa O (1) Czy O (n)?

Są operacje zmiany O(1) Czy O(n) ?

Czy to ma sens, że komputery zazwyczaj wymagają więcej operacji, aby przesunąć 31 miejsc zamiast 1 miejsca?

Czy ma sens liczba operacji wymaganych do przesunięcia jest stała niezależnie od tego, ile miejsc musimy się przesunąć?

PS: zastanawiam się, czy hardware jest odpowiednim tagiem..

Author: ROMANIA_engineer, 2012-01-31

6 answers

Niektóre zestawy instrukcji są ograniczone do jednego przesunięcia bitowego na instrukcję. Niektóre zestawy instrukcji pozwalają określić dowolną liczbę bitów do przesunięcia w jednej instrukcji, co zwykle zajmuje jeden cykl zegara na nowoczesnych procesorach (Nowoczesne jest celowo niejasne słowo). Zobacz dan04 ' s answer o baryłce shifter, obwodzie, który przesuwa więcej niż jeden bit w jednej operacji.

Wszystko sprowadza się do algorytmu logicznego. Każdy bit w wyniku jest funkcją logiczną opartą na wejście. Dla pojedynczego prawego przesunięcia algorytm byłby podobny do:

  • jeżeli instrukcją jest [shift right], a bit 1 wejścia to 1, to bit 0 wyniku to 1, w przeciwnym razie bit 0 to 0.
  • jeśli instrukcja jest [shift right], to bit 1 = bit 2.
  • itd.

Ale równanie logiczne równie łatwo może być:

  • jeżeli instrukcją jest [shift right], a operand amount wynosi 1, to bit wyniku 0 = przesunięty bit wejściowy 1.
  • jeśli kwota jest 2 następnie bit 0 = bit 2.
  • i tak dalej.

Bramki logiczne, jako asynchroniczne, mogą to wszystko zrobić w jednym cyklu zegara. Jednak prawdą jest, że pojedyncza zmiana pozwala na szybszy cykl zegara i mniej bramek do rozliczenia, jeśli wszystko, co porównujesz, to te dwa smaki instrukcji. Albo alternatywą jest wydłużenie czasu rozliczenia, więc instrukcja zajmuje 2 lub 3 zegary lub cokolwiek innego, a logika liczy się do 3, a następnie blokuje wynik.

MSP430, na przykład, tylko czy pojedynczy bit obraca się w prawo instrukcje (ponieważ można wykonać pojedynczy bit shift lub obrócić w lewo z inną instrukcją, którą zostawię czytelnikowi, aby dowiedzieć się).

Zestaw instrukcji ARM umożliwia zarówno natychmiastowe, jak i oparte na rejestrze wielobitowe obroty, przesunięcia arytmetyczne i przesunięcia logiczne. Myślę, że jest tylko jedna rzeczywista Instrukcja obracania, a druga jest aliasem, ponieważ obrót w lewo 1 jest taki sam jak obrót w prawo 32, potrzebujesz tylko jednokierunkowego przesunięcia lufy, aby zaimplementuj obrót wielu bitów.

SHL w x86 pozwala na więcej niż jeden bit NA instrukcję, ale zwykle zajmuje więcej niż jeden zegar.

I tak dalej, możesz z łatwością przejrzeć każdy z zestawów instrukcji.

Odpowiedź na twoje pytanie jest taka, że nie jest ustalona. Czasami jest to jedna operacja, jeden cykl, jedna instrukcja. Czasami jest to jedna instrukcja wiele cykli zegara. Czasami jest to wiele instrukcji, wiele cykli zegara.

Kompilatory często Optymalizacja dla tego rodzaju rzeczy. Powiedzmy, że masz 16-bitowy zestaw instrukcji rejestru z instrukcją swap bajtową i instrukcją AND z natychmiastowym, ale tylko jednym przesunięciem bitowym. Możesz myśleć, że przesunięcie 8 bitów wymagałoby 8 cykli instrukcji przesunięcia, ale możesz po prostu zamienić bajty (jedną instrukcję), a następnie i dolną połowę na zera (co może zająć dwie instrukcje, lub może być instrukcją o zmiennej długości słów dwóch słów, lub może kodować w jedną instrukcję), więc zajmuje tylko 2 lub 3 cykle instrukcji/zegara zamiast 8. Dla zmiany 9 bitów, można zrobić to samo i dodać zmianę, Co 9 Zegary vs 3 lub 4. Ponadto na niektĂłrych architekturach szybciej jest mnoĺľyä ‡ przez 256 niĹĽ przesuniÄ ™ Ä ‡ przez 8, itd., itp. Każdy zestaw instrukcji ma swoje ograniczenia i sztuczki.

Nie jest nawet tak, że albo większość zestawów instrukcji zapewnia wiele bitów, albo większość ogranicza jeden bit. Procesory należące do kategorii" komputer", takie jak X86, ARM, PowerPC i MIPS, skłaniałby się ku jednej operacji do zmiany. Rozszerz na wszystkie procesory, ale niekoniecznie" Komputery " powszechnie używane dzisiaj, i przesuwa się w drugą stronę, powiedziałbym, że więcej z nich jest pojedynczym bitem niż multi bit, więc wiele operacji jest potrzebnych do wykonania wielobitowego przesunięcia.

 12
Author: old_timer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:04

Abarrel shifter pozwala na wykonanie zmiany w przebiegu O(log n) - co może być wykonane w tym samym cyklu zegara, dzięki czemu przesunięcie jest operacją O(1).

 14
Author: dan04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 17:14:42

Jak już wspomniano, Dźwignia Zmiany Biegów może przesunąć operand o dowolną odległość w stałym czasie. Jednak barrel shifter zużywa sporo miejsca na matrycy procesora, więc nie są one uwzględniane we wszystkich konstrukcjach procesora.

Tylko dla jednego dość dobrze znanego przykładu, Intel Pentium III zawierał zmienną baryłkę -- ale Pentium IV nie , a nie. Kod napisany dla Pentium III zakładając, że w Pentium IV był baryłkowy shifter czasami trochę zwolnił. miałem kilka kod szyfrujący (który zawiera wiele zmian i rotacji) działał około 4 razy szybciej na Pentium III 1.2 GHz niż na Pentium IV 2.8 GHz.

 8
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 20:12:51

Przesunięcie bitowe jest O (1) praktycznie na każdym obecnym procesorze.

Spójrz na przykład na instrukcję x86 "shrw". Pierwszym operandem (w składni AT & T)jest liczba bitów do przesunięcia. To, jak kompilator implementuje przesunięcia, zależy od kompilatora, ale głupio byłoby umieścić przesunięcia w pętli, gdy procesor może przesunąć N bitów za jednym zamachem.

Dodatek: Re: czy do przesunięcia w lewo 31 wymagają więcej operacji?" Są różne rodzaje zmian (jeśli zastanawiasz się dlaczego, zastanów się, co zrobić z bitami, które są przesunięte poza rejestr), ale większość procesorów może wykonać przesunięcie jednej instrukcji o tyle bitów, ile może przechowywać GPR. Aby zrobić 40-bitowe przesunięcie na rejestrze 32-bitowym wymagałoby przesunięcia w wielu rejestrach (zakładając, że numer 64-bitowy jest przechowywany w 2 rejestrach 32-bitowych), co na każdym procesorze, który znam, będzie wymagało więcej instrukcji. Nadal byłoby O(1), tylko prawdopodobnie nie 1 Zegar. Ciekawostką jest Procesor Pentium IV jest zadziwiająco powolny przy przesunięciach bitowych. Jest to ironiczne, ponieważ Intel historycznie zalecał optymalizację ^2 dzielenia i mnożenia poprzez przesuwanie bitów. Zobacz: ten plik PDF i Google, aby uzyskać więcej informacji, jeśli jesteś zainteresowany.

 7
Author: Charles Burns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 17:51:16

Dla zwykłego sprzętu rejestry o stałym rozmiarze są stałe niezależnie od tego, ile miejsc przesuniesz.

Zauważ również, że użycie notacji O jest tutaj dość dziwne, zwykle używasz jej do oznaczenia złożoności algorytmu na podstawie liczby do przesunięcia, a nie liczby miejsc do przesunięcia..

 2
Author: Karoly Horvath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 17:13:54

Przetestowałem to z ciekawości w c# i dostałem śmieszne wyniki.

var sw = Stopwatch.StartNew();
long l = 1;
for (long i = 0; i < 20000000; i++) {
    l = l << 60; l = l >> 60;
    l = l << 60; l = l >> 60;
    l = l << 60; l = l >> 60;
    //...
    // 50 of ^them^ total

}
Console.WriteLine(l + " " + sw.Elapsed);
To trwa 1.2 SEK na moim komputerze. But if I replace
l = l << 60; l = l >> 60;

Z

l = l << 1; l = l >> 1;

Następnie CZASzwiększa się do 2,0 sek. Nie mam pojęcia, jakie optymalizacje są tutaj w grze, ale wygląda to dziwnie.

 1
Author: user1096188,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-31 17:24:05