C语言笔试题:实现把一个无符号整型数字的二进制序列反序后输出

目录

题目

实例

方法一:直接交换

方法二:间接交换

拓展


题目

编写一个函数,将一个无符号整数的所有位逆序(在32位机器下)

实例

例如有一个无符号整数 

unsigned int num = 32;

unsigned int 在32位系统中占4个字节(32位)

32的二进制数是:       0000 0000 0000 0000 0000 0000  0010 0000

逆序后的二进制数是: 0000 0100 0000 0000 0000 0000  0000 0000

逆序后10进制数是   :  1 * 2^26 = 67108864

方法一:直接交换

思路:就是将num的最高位最低位依次取出并交换

问题来了: 如何依次取出最高位和最低位呢?

先说最低位:

可以利用 0 & 1 = 0 , 1 & 1 = 1的方法判断,即可用0x00000001和num进行&运算,如果结果是0则表示最低位是0,否是是1

同理:最高位将num与0x80000000进行&运算(因为8的二进制是10000),如果结果是0则表示最低位是0,否是是1

取出最高位最低位就可以进行交换。

if(最高位是1)

{

        将最低位变成1

        利用 0 | 1 = 1 , 1 | 1 = 1来进行操作

        num = num | 0x00000001;// 即最低位变成1

}  

else

{    

        将最低位变成0

        利用 0 & 1 = 1 , 1 & 1 = 1来进行操作

        num = num & 0xFFFFFFFE;// 即最低位变成0

        0xFFFFFFFE还可以换一种写法: ~(0x00000001) 这样方便移位

}

 最低位同理

unsigned int reverseBits(unsigned int num)
{
    int i;
    for (i = 0; i < 16; i++)
    {
        // 左往右依次取出num最高位
        unsigned int hight = (num & 0x80000000 >> i) == 0 ? 0 : 1;
        // 右往左依次取出num最低位
        unsigned int low   = (num & 0x00000001 << i) == 0 ? 0 : 1;
        // 改变最低位
        if (hight == 1)
        {
            // 低位变成1
            num |= (0x00000001 << i);
        }
        else
        {
            // 低位变成0
            num &= ~(0x00000001 << i);
        }
        // 改变最高位
        if (low == 1)
        {
            // 高位变成1
            num |= (0x80000000 >> i);
        }
        else
        {
            // 高位变成0
            num &= ~(0x80000000 << i);
        }
    }
    return num;
}

方法二:间接交换

思路:就是将num的各个位取出并逆序存放在数组中,然后转成十进制

// 思路就是将各个位都取出来 逆序存在数组
unsigned int reverseBits_2(unsigned int num)
{
    int bits[32]; // 存放num的各个位
    int i;
    for (i = 0; i < 32; i++)
    {
        if (((num >> i) & 1) == 1)// 判断num的最低位是0还是1
        {
            bits[32 - i - 1] = 1;
        }
        else
        {
            bits[32 - i - 1] = 0;
        }
    }
    // 再组合(就是已知二进制数求10进制数)
    unsigned int ret = 0;
    for (i = 0; i < 32; i++)
    {
        if (bits[i] != 0)
        {
            ret += (unsigned int)pow(2, i);
        }
    }
    return ret;
}

拓展

求一个数二进制1的个数

        //方法一:1 左移
        for (int i = 0; i < 32; i++) {
            if((num&(1<<i)) == (1<<i)){
                count++;
            }
        }
        //方法二:数字右移
        for (int i = 0; i < 32; i++){
            if(((num>>i)&1)==1){
               count++;
            }
        }
        //方法三:减一&本身减一相当于将最后一个 1 消掉,后面的0变为1,在&相当于去掉 最后一个1
        while (num!=0){
            num=(num-1) & num;
            count++;
        }

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以提供一个参考的C语言程序: #include <stdio.h> int main() { int n, reverse = 0, remainder; printf("输入一个十进制整数:"); scanf("%d", &n); while (n > 0) { remainder = n % 2; reverse = reverse * 10 + remainder; n = n /2; } printf("转换后的十进制数是:%d", reverse); return 0; } ### 回答2: C语言编写程序,实现输入一个十进制整数,将其转换为二进制反序,再将得到的二进制数转换为新的十进制数并输出。 首先,我们需要使用scanf函数从用户输入获取一个十进制整数,并将其存储在一个整型变量中。 接下来,我们需要使用一个循环来将十进制整数转换为二进制数并进行反序。首先,我们用一个空字符串将二进制数存储起来。然后,我们用除以2的余数不断更新字符串,并将十进制数除以2更新为商,直到十进制数为0为止。这样可以得到反序二进制数。 接着,我们需要使用一个循环来将反序二进制数转换为新的十进制数,并将其输出。首先,我们将反序二进制数作为一个字符串传递给一个整型变量,并设置一个初始值为1的变量result来作为最终的十进制数。然后,我们从字符串的最后一位开始遍历,如果该位上的值为1,则将result加上对应的权值(1、2、4、8、16...);若为0,则保持result不变。最后,将result输出即可得到新的十进制数。 最后,我们需要将程序进行整合,包括上述的输入、转换和输出步骤。注意,我们需要在程序结束前释放之前动态分配的内存空间,而输入的十进制整数和新的十进制数无需释放。 总结起来,这个程序可以实现输入一个十进制整数,将其转换为二进制反序,再转换为新的十进制数并输出。代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int decimal; printf("请输入一个十进制整数:"); scanf("%d", &decimal); // 将十进制整数转换为二进制字符串并反序 char* binary = (char*)malloc(sizeof(char) * 32); int i = 0; while (decimal != 0) { binary[i++] = (decimal % 2) + '0'; decimal /= 2; } binary[i] = '\0'; strrev(binary); // 反序二进制字符串 // 将二进制字符串转换为新的十进制数并输出 int result = 0; int power = 1; for (int j = strlen(binary) - 1; j >= 0; j--) { if (binary[j] == '1') { result += power; } power *= 2; } printf("反序二进制转换为新的十进制数:%d\n", result); free(binary); // 释放内存空间 return 0; } ``` 使用该程序,用户可以输入一个十进制整数,程序将会将其转换为二进制反序,并转换为新的十进制数并输出。 ### 回答3: 题目要求输入一个十进制整数,将其转换为二进制反序再转成新的十进制后输出。下面是用C语言编写的程序实现: ```c #include <stdio.h> #include <math.h> int reverse(int n) { int reversed = 0; while (n > 0) { reversed = reversed * 10 + n % 10; n /= 10; } return reversed; } int binaryToDecimal(int n) { int decimal = 0, i = 0, remainder; while (n != 0) { remainder = n % 10; decimal += remainder * pow(2, i); n /= 10; i++; } return decimal; } int main() { int input, binary, reversed, output; printf("请输入一个十进制整数:"); scanf("%d", &input); // 十进制转二进制,然后反序 binary = reverse(input); // 二进制转十进制 output = binaryToDecimal(binary); printf("转换后的新十进制数为:%d\n", output); return 0; } ``` 程序首先定义了两个辅助函数`reverse`和`binaryToDecimal`,分别用于将一个整数反序和将二进制数转换为十进制数。在主函数`main`中,首先获取用户输入的十进制整数,然后将其转换成二进制数并反序。随后,再将反序后的二进制数转换成新的十进制数并输出。最后,程序返回0表示成功结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aogu181

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值