我试图解答这个练习
练习 2-7 编写函数 rightrot(b, n),将整数 b 向右旋转 n 位。
我确实编写了代码,代码如下
#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;
}
输入和输出是
Enter number: 153
Enter rotation: 3
-13
153 的二进制表示为 000000000000000000000000010011001,因此当它进入 while 循环时,它会第一次进入 if (当 n 为 3 时),并且如您所见,里面有 6 行代码使用按位运算符来操作 b,我认为这 6 行应该如何改变 b
00000000000000000000000001001100
10011000000000000000000000000000
01100111111111111111111111111111
00110011111111111111111111111111
11001100000000000000000000000000
00000000000000000000000011001100
然后 n 是 2,然后其他 2 个 while 循环应该通过,否则我不会解释,因为如果 6 行代码本身不能按我想要的方式工作,我知道这一点是因为我分别测试了它们。
另外,这一切都是为了我将二进制旋转为 8 位而不是 32 位。
最终输出应该是 51,我使用的是完全更新的 64 位 arch linux,终端是 suckless 的 st,文本编辑器是 vim,我使用“gcc main.c -o main”编译了代码。
最终输出应为 51
unsigned
当使用数学时可以实现b
。当可能需要逻辑右移时,类似这样的代码
b = b >> 24;
会执行符号扩展右移。