求一个整数的二进制最高位

C语言里求一个整数的二进制位数 本文里主要会通过三种方法解决该问题: ​​​​​​​1.除二取1,计数器加一 2.按位与1 3.按位与其减一 从易到难,读者可以自行阅读 1.利用二进制求法中的基本原理 我们可以看到计算11的二进制先计算11/2作为下一个被除数,再计算11%2我们知道一个数摸2的结果只有可能是0或者1,如果是1,则计数器加一这是一次计算,接下来再以11/5的结果作为下一次计算,重复上述步骤即可 #include <stdio.h> int count_1(int a) { in. 阅读详情

求十进制整数的最高位非常简单,那计算机如何求一个整数的二进制最高位?

众所周知,计算是通过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;
}

求任意一个正整数的二进制中有多少个比特位为1 思路 一个正整数的二进制中有多少个比特位为1,最直接可想到的是,将该正整数化为二进制的形式,挨个数出其中有多少个1即可。C语言中,和比特位相关的内容,即是位操作。此处可以将该正整数与 0x01 进行位与,即可得知该数的二进制最低位是否为1,然后将该数向右移动一位,再次判断移动后的最低位是否为1,依次操作,直到该数右移变成0. 代码实现 #include &lt;stdio.h&gt; ... 阅读详情

相关推荐

求二进制数的掩码

问题:要求出二进制数(此处限定为非负整数)的掩码,比如对于十进制数5,写成二进制为101,则其掩码为111即十进制数7,对于十进制数23(10111)其掩码为31(11111)。           任意非负整数m都满足,而即为m的掩码,如,而5的掩码即为。因此我们的思路其实就是找到这个K值就能求出掩码。           方法1: 直接求取。           直接利用库函数的对数运算

压碎起重机 4514

求二进制最低位1和最高位1的方法,以及反转二进制,复杂度O(1)

本文主要对三个二进制操作算法进行介绍,它们都是O(1)的。相对于暴力移位去计算,效率会高很多。这三个算法分别是 获取最低的1的比特位、获取最高1的比特位,反转二进制。

学者的博客 7988

【编程之美】任意给定一个32位无符号整数n,求n的二进制表示中1的个数

任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4。这也是一道比较经典的题目了,相信不少人面试的时候可能遇到过这道题吧,我今天就遇到了,当时懵了。现在想想多简单,浪费了一次机会。 1.普通法 这种方法最简单,就是通过移位+计数。首先把n于1相&,如果结果==1,说明最后一位是1,计数器+1;然后右移一位,最后一位

hllyyy的专栏【Nothing replaces hard work】 8492

位运算学习

位运算笔记

m0_60452277的博客 4654

LightTools手动创建菲涅尔透镜的5个实用技巧(附详细步骤图)

本文详细介绍了在LightTools中手动创建菲涅尔透镜的5个核心技巧,包括理解旋转体与折线原理、高效构建多齿轮廓、编辑优化、坐标系定位以及属性设置与验证。通过分步图解和实用策略,帮助用户突破内置工具限制,实现对非标准齿形和复杂光学设计的完全掌控,提升建模精度与仿真效率。

onion的博客 775

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 353

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 >...

已迁移至 https://seekstar.github.io/ 4460

【遥感数字图像处理(朱文泉)】第一章 数字图像基础

关于图像的定义、类型、模拟图像和数字图像

甜子yu的博客 4404

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 &...

weixin_33976326的博客 325

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6973

车载诊断架构 --- 车载ECU开发中DTC数量与芯片存储能力的关系及应对策略

本文探讨了汽车电子系统中ECU存储DTC故障码的容量问题及解决方案。作者作为汽车电子工程师,针对台架测试中遇到的DTC存储超限案例展开分析,指出随着汽车智能化发展,ECU需处理的DTC数量激增与芯片存储能力有限的矛盾。文章详细介绍了DTC的存储需求、ECU支持数量与芯片容量的关系,并提出应对策略,通过实际案例验证了方案的可行性。最后强调在ECU开发中需合理分配存储资源,确保关键故障信息不丢失。

Soly_kun的博客 87

2的整数次幂

#特征: 2的整数次幂转化成二进制时,只有最高位是1,其他位都是0 #判断方法: 2的整数次幂用原数值和它自身减1的结果进行按位与运算,即**(m & (m - 1)) == 0**,结果一定为0!由此可以实现快速判断一个数是否为2的整数次幂数。 #求一个数最近的比它大的2的整数次幂数: 将该数最高位向右的位全部设置为1,再用变化后的数字+1即可得到最近的比它大的2的整数次幂数 具体代码实现: 如果该数不为2的整数次幂数 m |= m >> 1; m |= m &gt

oy0918的博客 2022

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版)

Windows服务器环境下 OpenCode Skill 下载与运行全流程实战指南(小白版),OpenCode技能安装与使用指南,分为四个步骤:1)准备Windows服务器环境并确认OpenCode可用;2)通过Git或直接下载方式获取Skill;3)配置技能路径至.opencode/config.json;4)运行测试技能。关键点包括路径配置必须使用双反斜杠、确保Python环境正确安装、管理员权限运行等。文中提供了文本总结技能的完整案例,从创建skill.yaml和main.py到注册运行的全流程,并针

专注于编程、AI、人工智能等多个领域内容研究和分析 1083

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

xiaopihaierletian的博客 472

有道龙虾LobsterAI vs. OpenClaw:对比与安装部署攻略

LobsterAI是"中国版OpenClaw",更注重易用性和中文场景适配;OpenClaw是技术极客的玩具,需要大量命令行操作。

lpfasd123的博客 2398

Qt垂直滚动条QVerticalScrollBar详解:从基础到实战的控件开发指南

本文系统解析Qt中QVerticalScrollBar的用法,从基础概念到进阶技巧。主要内容包括:1)基础认知:介绍其继承关系、作用及典型应用场景;2)核心用法:创建方法、关键属性配置和信号槽连接;3)进阶技巧:自定义样式表美化外观,以及与自定义内容区域的联动实现;4)实战注意事项,如避免循环触发和高DPI适配等。文章强调掌握QVerticalScrollBar对提升Qt滚动类功能开发效率的重要性,并建议通过自定义文本编辑器实践巩固知识点。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 759

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 &...

weixin_29748637的博客 480

最新的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

王二的专栏 634

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...

6120

输入一个整数,求该整数的二进制表达中有多少个1

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的

void* jngxiao(void* life) 5032

整数转换为二进制

刷 二进制中1的个数 时,遇到该基础问题,故整理一下。 感谢参考链接:https://jingyan.baidu.com/article/84b4f565cf33fe60f6da321b.html 1、正整数转二进制 除2之后将余数倒序排列 2、负整数转二进制 1)得到取绝对值的整数的二进制。如-201,先得到201的二进制1001001 2)取反。得0110110 ...

longshaonihaoa的博客 1万+

Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1

求一个整数的二进制中1的个数。       题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。       分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。

不精通则死 9596

【位操作】——获取整数变量最高位为 1 的位置

在这个示例中, BIT_HIGH_BIT 宏被用于计算变量 num 的最高位为 1 的位置。根据二进制表示, num 的最高位为 1 的位置是第 3 位,因此输出的结果为。下面是一个示例,展示如何使用 BIT_HIGH_BIT 宏。

tyustli 2136

求一个整数的二进制中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一

dony1994的专栏 531
上一篇: CG Draw字符串旋转
下一篇: iPhone System Sounds
nitghost
博客等级 码龄19年 32粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值