Eu estava tentando resolver o exercício que diz
Exercício 2-7. Escreva a função rightrot(b, n) que rotaciona o inteiro b para a direita em n posições de bits.
e eu codifiquei, aqui está o código
#include <stdio.h>
int rightrot(int b, int n) {
char i = 1;
while (n > 0) {
if ((b & i) == i) {
b = b >> 1;
b = b << 25;
b = ~b;
b = b >> 1;
b = ~b;
b = b >> 24;
}
else
b = b >> 1;
n--;
}
return b;
}
int main() {
int i, j, k;
printf("Enter number: ");
scanf("%d", &i);
printf("Enter rotation: ");
scanf("%d", &j);
k = rightrot(i, j);
printf("%d\n", k);
return 0;
}
entradas e saídas são
Enter number: 153
Enter rotation: 3
-13
153 em binário é 0000000000000000000000000010011001, então quando ele entra no loop while dentro do while ele entra no if pela primeira vez (quando n é 3), e como você vê dentro do if há 6 linhas de código com operadores bit a bit para manipular b e é isso que eu acho que essas 6 linhas devem mudar b
00000000000000000000000001001100
10011000000000000000000000000000
01100111111111111111111111111111
00110011111111111111111111111111
11001100000000000000000000000000
00000000000000000000000011001100
e então n é 2 e então outros 2 loops while devem passar, senão não vou explicar, pois o código de 6 linhas do if em si não funciona como eu quero, eu sei disso porque testei-os separadamente.
Além disso, tudo isso é porque estou rotacionando o binário, pois ele é de 8 bits e não de 32 bits.
O resultado final deve ser 51, e estou usando o Arch Linux, que é de 64 bits, totalmente atualizado, o terminal é st by suckless, o editor de texto é vim, compilei o código usando "gcc main.c -o main".