[[Überschrift]Zaehlen der 1er, Quersummen] Zum Zahlen der 1er ist in HAKMEM ITEM 169 ein PDP-6/10 Assembler Hack beschrieben. Er funktioniert folgendermassen: 1. Arrangiere die bits so, dass jede 3ergruppe die Summe der Eingabebits enthaelt. 2. Analog zur Tatsache dass die Quersumme einer Zahl gleich ihrem 9errest ist, solange sie kleiner ist als 9, kann man die Summe dieser 3ergruppen bestimmen in dem man den 7errest nimmt. |
] Das heisst, wir verschieben die Zahl x so lange nach links bis sie 0 wird. Dies kostet genau so viel wie die gesuchte Zahl ist, im schlimmsten Fall also n. |
] Das heisst, wir verschieben die Zahl x so lange nach rechts bis sie 0 wird. Dies kostet genau so viel wie die gesuchte Zahl ist, im schlimmsten Fall also n. |
:Eine wohl mehr akademische Variante beschreibt A. Brodnik in seinem Paper Computation of the least signifacant set bit. In Proceedings of the 2nd Electortechnical and Computer Science Conference, Slovenia, 1993. Da wird allerdings gezeigt, wie man das in konstanter Zeit machen kann ohne eine spezielle Instruktion wie in Variante 3 zu haben. |
:Eine wohl mehr akademische Variante beschreibt A. Brodnik in seinem Paper Computation of the least significant set bit. In Proceedings of the 2nd Electortechnical and Computer Science Conference, Slovenia, 1993. Da wird allerdings gezeigt, wie man das in konstanter Zeit machen kann ohne eine spezielle Instruktion wie in Variante 3 zu haben. :Die im Paper beschriebene Methode kann nun umgebaut werden, um das *most* significant bit zu finden. |
Die meisten Beispiele hier nehmen an dass man auf einer Ganzzahl operiert welche in der ZweierKomplementDarstellung? gespeichert ist. Abweichungen sind jeweils markiert. Binärzahlen werden auf dieser Seite jeweils kursiv dargestellt.
Falls wir die Bits nummerieren, so tun wir dies hier wie folgt für ein Byte:
![]() |
|
Zaehlen der 1er, Quersummen |
Zum Zahlen der 1er ist in HAKMEM ITEM 169 ein PDP-6/10 Assembler Hack beschrieben. Er funktioniert folgendermassen:
1. Arrangiere die bits so, dass jede 3ergruppe die Summe der Eingabebits enthaelt.
2. Analog zur Tatsache dass die Quersumme einer Zahl gleich ihrem 9errest ist, solange sie kleiner ist als 9, kann man die Summe dieser 3ergruppen bestimmen in dem man den 7errest nimmt.
Bestimmung spezieller Bits |
Bestimmung des am wenigsten Signifikanten Bits:
Der folgende Code setzt alle Bits, ausser das am wenigsten signifikante welches 1 ist, auf 0.
![]() |
|
Zum Beispiel für 12: (12 & -12) = 00001100 & 11110111 = 00000100 = 4 .
Bestimmung des signifikantesten Bits:
Die Bestimmung des signifikantesten Bits ist relativ trickreich. Es gibt verschiedene Varianten. Hier wollen wir gleich die Stelle herausfinden, das heisst wir bestimmen den abgerundeten Zweierlogarithmus der Zahl x. Wir nehmen an das unsere Zahl n bits hat und das die Zahl vorzeichenlos ist.
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
Prüfung, ob genau 1 Bit gesetzt ist (2^n):
![]() |
|
Prüfung, ob ab LSB lückenlos 1-Bits vorliegen:
![]() |
|
Löschen, setzen und umschalten einzelner Bits |
![]() |
|
Löschen, setzen oder umschalten der Bits i-1 bis 0.
Dies betrifft die i am wenigsten signifikanten Bits:
![]() |
|
Löschen, setzen oder umschalten der Bits n-1 bis n-i.
Hier ist n die Wortlängen, das heisst bit n-1 ist das signifikanteste Bit. Demnach verändern wir hier die i wichtigsten Bits.
![]() |
|
Dividieren und Rest von einer Zweierpotenz |
Dies wird zum Beispiel verwendet, um festzustellen in welchem Block sich ein bestimmtes Byte einer Datei im UNIX-Dateisystem befindet.
Dividieren und Rest modulo 1024 = 2^10:
![]() |
|
Falls man eine Datei mit x bytes hat, kann man so auch feststellen wieviele Blöcke sie insgesamt benötigt:
![]() |
|