当前位置: 首页 > news >正文

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){// 低位变成1num |= (0x00000001 << i);}else{// 低位变成0num &= ~(0x00000001 << i);}// 改变最高位if (low == 1){// 高位变成1num |= (0x80000000 >> i);}else{// 高位变成0num &= ~(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,在&相当于去掉 最后一个1while (num!=0){num=(num-1) & num;count++;}

http://www.lryc.cn/news/379245.html

相关文章:

  • elementplus如何实现dialog遮罩层外的元素可以被操作点击
  • Springboot整合Kafka消息队列服务实例
  • kotlin——MVVM框架下的大型项目优化
  • echarts实现折线图点击添加标记
  • 循环赛日程表
  • 计算机网络:运输层 - 概述
  • 使用阿里开源的Spring Cloud Alibaba AI开发第一个大模型应用
  • `THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。
  • Android-Android Studio-FAQ
  • 架构师指南:现代 Datalake 参考架构
  • 通讯协议大全(UART,RS485,SPI,IIC)
  • 基于EXCEL数据表格创建省份专题地图
  • 基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241
  • 好文!12个策略解决 Kafka 数据丢失问题
  • Android 第三方框架:网络:OkHttp:源码分析:拦截器
  • FlowUs AI的使用教程和使用体验
  • SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘
  • 阿贝云免费虚拟主机和免费云服务器评测
  • 不懂就问,开通小程序地理位置接口有那么难吗?
  • Python 全栈系列256 异步任务与队列消息控制(填坑)
  • 从零开始的Ollama指南:部署私域大模型
  • C++类和对象总结
  • 基于PHP的民宿管理系统
  • ROS中C++、Python完整的目录结构
  • Boosting原理代码实现
  • 【Qt基础教程】事件
  • 外星人Alienware m15R7 原厂Windows11系统
  • stata17中java installation not found或java not recognozed的问题
  • Harbor本地仓库搭建003_Harbor常见错误解决_以及各功能使用介绍_镜像推送和拉取---分布式云原生部署架构搭建003
  • 怎样搭建serveru ftp个人服务器