我试图解决下面的练习:
练习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行代码本身不能像我想要的那样工作,我知道这一点,因为我单独测试了它们。
最终输出应该是51,我使用的是64位完全更新的arch linux,终端是suckless的st,文本编辑器是vim,我使用“gcc main.c -o main”编译了代码。
最终输出应该是51
当将
usigned
数学用于b
时可以实现。
// int rightrot(int b, int n) {
int rightrot(unsigned b, int n) {