【问题标题】:Why wont my C code about reversed bits work?为什么我的关于反向位的 C 代码不起作用?
【发布时间】:2021-11-13 14:46:03
【问题描述】:

我正在编写代码来反转一个无符号整数,其位相同但顺序相反。我的代码在接受用户输入时不会停止运行。我做错了什么?

#include <stdio.h>

unsigned int reverse_bits(unsigned int n);

int main(void) {
        unsigned int n;
        printf("Enter an unsigned integer: ");
        scanf("%u",&n);
        printf("%u\n",reverse_bits(n));
        return 0;
}

unsigned int reverse_bits(unsigned int n) {
        unsigned int reverse = 0;
        while(n>0) {
                reverse <<= 1;
                if((n & 1) == 1) {
                        reverse = reverse^1;
                }
        }
        return reverse;
}

【问题讨论】:

  • 你永远不会在循环内修改n,所以循环永远不会结束。
  • 如果输入是 1011,您想要输出 1101(反转为四个有效位)还是 11010000000000000000000000000000(反转为 32 位,或其他一些固定大小的字段)?如果只在有效位内反转,请注意反转的反转不会恢复数字,因为反转 101100 会产生 001101,即 1101,然后反转会产生 1011,而不是原来的 101100。

标签: c reverse bit unsigned-integer


【解决方案1】:

在您的程序中,while 条件是检查 n 是否大于零。但是,在循环内部,没有修改 n 的操作。所以请尝试使用它。它会起作用的。

unsigned int reverse_bits(unsigned int n) {
    unsigned int reverse = 0;
    while (n>0) {
            reverse <<=1;
            if((n & 1) == 1) {
                    reverse = reverse | 1;
            }
            n=n>>1;

    }
    return reverse;

}

【讨论】:

    【解决方案2】:

    正如@Mark Benningfield 所说,您忘记在循环内修改n

    反转字符串的最佳方法是:-

    只有当最左边的位是1时才会运行。

      unsigned int reverse_bits(unsigned int n) 
        {
          unsigned int reverse = 0;
            int x = 1;
            while ( n > 0 )
            {
                reverse = reverse << 1;
                if ( n & x )
                    reverese = reverse | 1;
                n = n >> 1;
            }
            return reverse;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2013-08-06
      相关资源
      最近更新 更多