Het natuurlijk getal $$(19)_{10}$$ (decimale voorstelling) kan geschreven worden als $$(10011)_2$$ in het binair talstelsel. Dit laat ons toe om de rotatie naar rechts van een natuurlijk getal te definiƫren als de bewerking waarbij het laatste cijfer vooraan geplaatst wordt in de binaire voorstelling van het getal. Als we op die manier het binair getal $$(10011)_2$$ naar rechts roteren, dan bekomen we het binair getal $$(11001)_2 = (25)_{10}$$.

Als na een rotatie naar rechts een nul vooraan een binair getal komt te staan, dan mag die weggelaten worden. Op die manier kan een reeks getallen opgebouwd worden, waarbij het volgende getal steeds bekomen wordt door een rotatie naar rechts uit te voeren. Deze rechtse rotatiereeks eindigt als de binaire voorstelling van het laatste getal geen nullen meer bevat (omdat voorloopnullen weggelaten worden). De rechtse rotatiereeks van het getal 19 wordt dan bijvoorbeeld

$$19$$ $$\stackrel{\text{r}}{\longrightarrow}$$ $$25$$ $$\stackrel{\text{r}}{\longrightarrow}$$ $$28$$ $$\stackrel{\text{r}}{\longrightarrow}$$ $$14$$ $$\stackrel{\text{r}}{\longrightarrow}$$ $$7$$
$$10011$$ $$11001$$ $$11100$$ $$0\!\!\!\!\!-\!\!1110$$ $$0\!\!\!\!\!-\!\!111$$

De som van de getallen in de rechtse rotatiereeks wordt de rechtse rotatiesom genoemd. De rechtse rotatiesom van het getal 19 is bijgevolg $$19 + 25 + 28 + 14 + 7 = 93$$.

De omgekeerde bewerking, waarbij het eerste cijfer in de binaire voorstelling van een natuurlijk getal achteraan geplaatst wordt, wordt dan logischerwijs de rotatie naar links van het getal genoemd. De rotatie naar links van $$(10011)_2 = (19)_{10}$$ is dan $$(0\!\!\!\!\!\!-\!\!0\!\!\!\!\!\!-\!\!111)_2 = (7)_{10}$$, waarbij in dit voorbeeld twee voorloopnullen weggelaten worden. Analoog als bij de rotatie naar rechts, kunnen op basis van de rotatie naar links ook de linkse rotatiereeks en de linkse rotatiesom gedefinieerd worden. De linkse rotatiesom van 357 is dan 789, zoals kan afgeleid worden uit de bijhorende linkse rotatiereeks

$$357$$ $$\stackrel{\text{l}}{\longrightarrow}$$ $$203$$ $$\stackrel{\text{l}}{\longrightarrow}$$ $$151$$ $$\stackrel{\text{l}}{\longrightarrow}$$ $$47$$ $$\stackrel{\text{l}}{\longrightarrow}$$ $$31$$
$$101100101$$ $$0\!\!\!\!\!-\!\!11001011$$ $$10010111$$ $$0\!\!\!\!\!-\!\!0\!\!\!\!\!-\!\!101111$$ $$0\!\!\!\!\!-\!\!11111$$

Opgave

Schrijf drie functies rotatie, rotatiereeks en rotatiesom, waarmee respectievelijk de rotatie, de rotatiereeks en de rotatiesom van een gegeven natuurlijk getal $$n \in \mathbb{N}_0$$ kunnen berekend worden. Elk van deze functies heeft een parameter getal waaraan het getal $$n$$ moet doorgegeven worden. Daarnaast hebben alle functies nog een parameter rechts waaraan optioneel een Booleaanse waarde kan doorgegeven worden. Deze geeft aan of rotaties naar rechts (waarde True, de standaardwaarde) of naar links (waarde False) moeten uitgevoerd worden. Probeer je eigen programmacode zo optimaal mogelijk te hergebruiken bij het implementeren van deze drie functies.

Tip: ga na hoe de ingebouwde Python functies bin en int kunnen gebruikt worden om de decimale voorstelling van een natuurlijk getal om te zetten naar zijn binaire voorstelling, en omgekeerd.

Voorbeeld

>>> rotatie(19)
25
>>> rotatie(25, rechts=True)
28
>>> rotatie(25, rechts=False)
19
>>> rotatie(19, rechts=False)
7

>>> rotatiereeks(19)
[19, 25, 28, 14, 7]
>>> rotatiereeks(69)
[69, 98, 49, 56, 28, 14, 7]
>>> rotatiereeks(205, rechts=True)
[205, 230, 115, 121, 124, 62, 31]
>>> rotatiereeks(357, rechts=False)
[357, 203, 151, 47, 31]
>>> rotatiereeks(54321, rechts=False)
[54321, 43107, 20679, 8591, 799, 575, 127]

>>> rotatiesom(19)
93
>>> rotatiesom(69)
321
>>> rotatiesom(205, rechts=True)
888
>>> rotatiesom(357, rechts=False)
789
>>> rotatiesom(54321, rechts=False)
128199