求十进制整数的最高位非常简单,那计算机如何求一个整数的二进制最高位?
众所周知,计算是通过01二进制来表示世界的,自然整数也是使用二进制存储在计算机硬盘中。那如何求一个整数的二进制最高位的位置?
首先我们看看下面两个简单的例子,再来讲解如何求解的过程。
eg 1:
十进制整数表示: 8
二进制整数表示:1000
很明显的,由十进制整数8的二进制表示形式可知,十进制整数8的二进制最高位是第4位。
eg 2:
十进制整数表示: -8
二进制整数表示:11111111 11111111 11111111 11111000 (补码)
显而易见,一个负整数的二进制最高位不容易看出来。我们需要将补码转换成原码的形式,这样容易看出负整数的二进制最高位的位置。
二进制整数表示:10000000 00000000 00000000 00001000 (原码)
现在是不是很容易就能看出最高位的位置?负整数-8的二进制最高位的位置是第4位。
求解算法:
(1)对所求整数求绝对值;
(2)将步骤(1)的结果转换成二进制表示形式;
(3)对二进制整数从最低位向最高位方向遍历,并判断最高位的位置。
关键点是如何将一个整数转换成二进制数?或许您会使用栈或数组来实现,但这不是本文的初衷。本文将采用另外一种更为简单的方法--位运算和掩码来实现上述的求解算法。
源码:
/*
* get_bit_pos.c
*
* Created on: 2010-3-24
* Author: Mutse Young
*/
#include <stdio.h>
#include <stdlib.h>
#define MASK 01 /* 掩码 */
int get_bit_high_pos(int n);
int main() {
int num = 0;
printf("please input an integer:/n");
scanf("%d", &num);
printf("the high pos of the integer %d is %d./n", num, get_bit_high_pos(num));
return 0;
}
int get_bit_high_pos(int n) {
unsigned int num = abs(n); /* 取绝对值 */
int i = 0, pos = 0;
for (i = 0; i <= 8 * sizeof(int); i++, num >>= 1) { /* 遍历二进制,求解最高位的位置 */
if ((num & MASK) == MASK) {
pos = i + 1;
}
}
return pos;
}
相关推荐
求二进制数的掩码
问题:要求出二进制数(此处限定为非负整数)的掩码,比如对于十进制数5,写成二进制为101,则其掩码为111即十进制数7,对于十进制数23(10111)其掩码为31(11111)。 任意非负整数m都满足,而即为m的掩码,如,而5的掩码即为。因此我们的思路其实就是找到这个K值就能求出掩码。 方法1: 直接求取。 直接利用库函数的对数运算
求二进制最低位1和最高位1的方法,以及反转二进制,复杂度O(1)
本文主要对三个二进制操作算法进行介绍,它们都是O(1)的。相对于暴力移位去计算,效率会高很多。这三个算法分别是 获取最低的1的比特位、获取最高1的比特位,反转二进制。
【编程之美】任意给定一个32位无符号整数n,求n的二进制表示中1的个数
任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4。这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,我今天就遇到了,当时懵了。现在想想多简单,浪费了一次机会。 1.普通法 这种方法最简单,就是通过移位+计数。首先把n于1相&,如果结果==1,说明最后一位是1,计数器+1;然后右移一位,最后一位
位运算学习
位运算笔记
LightTools手动创建菲涅尔透镜的5个实用技巧(附详细步骤图)
本文详细介绍了在LightTools中手动创建菲涅尔透镜的5个核心技巧,包括理解旋转体与折线原理、高效构建多齿轮廓、编辑优化、坐标系定位以及属性设置与验证。通过分步图解和实用策略,帮助用户突破内置工具限制,实现对非标准齿形和复杂光学设计的完全掌控,提升建模精度与仿真效率。
J-Flash手动添加华大HC32F460型号全攻略
在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配
C语言取二进制最高位1
膜拜mstlq:https://bbs.youkuaiyun.com/topics/330068401 //find the Power of 2 that Greater than or Equal to x uint32_t p2ge(uint32_t x) { --x; x = x | (x >> 1); x = x | (x >> 2); x = x | (x >...
【遥感数字图像处理(朱文泉)】第一章 数字图像基础
关于图像的定义、类型、模拟图像和数字图像
java 数字高位_java - 算法 - 求小于一个数字的二进制的最高位
看Integer源码的时候发现的= =感觉非常有意思。。。public static int highestOneBit(inti) {//HD, Figure 3-1i |= (i >> 1);i|= (i >> 2);i|= (i >> 4);i|= (i >> 8);i|= (i >> 16);return i - (i &...
Blender关于GIS安装及使用天地图
Blender下载安装及GIS插件的安装及使用
车载诊断架构 --- 车载ECU开发中DTC数量与芯片存储能力的关系及应对策略
本文探讨了汽车电子系统中ECU存储DTC故障码的容量问题及解决方案。作者作为汽车电子工程师,针对台架测试中遇到的DTC存储超限案例展开分析,指出随着汽车智能化发展,ECU需处理的DTC数量激增与芯片存储能力有限的矛盾。文章详细介绍了DTC的存储需求、ECU支持数量与芯片容量的关系,并提出应对策略,通过实际案例验证了方案的可行性。最后强调在ECU开发中需合理分配存储资源,确保关键故障信息不丢失。
2的整数次幂
#特征: 2的整数次幂转化成二进制时,只有最高位是1,其他位都是0 #判断方法: 2的整数次幂用原数值和它自身减1的结果进行按位与运算,即**(m & (m - 1)) == 0**,结果一定为0!由此可以实现快速判断一个数是否为2的整数次幂数。 #求一个数最近的比它大的2的整数次幂数: 将该数最高位向右的位全部设置为1,再用变化后的数字+1即可得到最近的比它大的2的整数次幂数 具体代码实现: 如果该数不为2的整数次幂数 m |= m >> 1; m |= m >
Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)
Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针
LeetCode 476. Number Complement-Java
原题: Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation. Note: The given integer is guaranteed to fit within the ran
有道龙虾LobsterAI vs. OpenClaw:对比与安装部署攻略
LobsterAI是"中国版OpenClaw",更注重易用性和中文场景适配;OpenClaw是技术极客的玩具,需要大量命令行操作。
Qt垂直滚动条QVerticalScrollBar详解:从基础到实战的控件开发指南
本文系统解析Qt中QVerticalScrollBar的用法,从基础概念到进阶技巧。主要内容包括:1)基础认知:介绍其继承关系、作用及典型应用场景;2)核心用法:创建方法、关键属性配置和信号槽连接;3)进阶技巧:自定义样式表美化外观,以及与自定义内容区域的联动实现;4)实战注意事项,如避免循环触发和高DPI适配等。文章强调掌握QVerticalScrollBar对提升Qt滚动类功能开发效率的重要性,并建议通过自定义文本编辑器实践巩固知识点。
java最高位_java - 算法 - 求小于一个数字的二进制的最高位
看Integer源码的时候发现的= =感觉非常有意思。。。public static int highestOneBit(inti) {//HD, Figure 3-1i |= (i >> 1);i|= (i >> 2);i|= (i >> 4);i|= (i >> 8);i|= (i >> 16);return i - (i &...
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
二进制整数中1的个数
#include using namespace std; int NumberOf1_1(int n){ int count=0; while(n){ if(n&1) count++; n=n >> 1; } //当n为负数时,会出现死循环,故此法不可取 return count; } int NumberOf1(int
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
【C语言经典算法】将一个整数按二进制输出
文章目录1、用位运算实现2、用符号位实现 1、用位运算实现 将mask右移 #include <stdio.h> int main() { const int bits = sizeof(int) * 8; unsigned int mask = 1 << bits - 1;// 0x80000000 int n; printf("Input an i...
输入一个整数,求该整数的二进制表达中有多少个1
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的
整数转换为二进制
刷 二进制中1的个数 时,遇到该基础问题,故整理一下。 感谢参考链接:https://jingyan.baidu.com/article/84b4f565cf33fe60f6da321b.html 1、正整数转二进制 除2之后将余数倒序排列 2、负整数转二进制 1)得到取绝对值的整数的二进制。如-201,先得到201的二进制1001001 2)取反。得0110110 ...
Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1
求一个整数的二进制中1的个数。 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。
【位操作】——获取整数变量最高位为 1 的位置
在这个示例中, BIT_HIGH_BIT 宏被用于计算变量 num 的最高位为 1 的位置。根据二进制表示, num 的最高位为 1 的位置是第 3 位,因此输出的结果为。下面是一个示例,展示如何使用 BIT_HIGH_BIT 宏。
求一个整数的二进制中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一
4514



被折叠的 条评论
为什么被折叠?



