为什么输出不是我期望的

问题描述 投票:0回答:1

我试图解决下面的练习:

练习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”编译了代码。

c bit-manipulation bitwise-operators bit-shift
1个回答
0
投票

最终输出应该是51

当将

usigned
数学用于
b
时可以实现。

// int rightrot(int b, int n) {
int rightrot(unsigned b, int n) {
© www.soinside.com 2019 - 2024. All rights reserved.