3行代码为何能求得二进制数中1比特的个数

matlab实现 图像的比特平面分层 代码 题目:自定义一个用于比特平面分层的函数,给定一副8比特灰度图像(EXP3B.tif和EXP3C.tif),输出该图像第1阶至第8阶比特平面图像。 说明:函数模板为imageBit = myImageBitPlaneSlicing(img);其中,输入参数img为一幅m×n×1的8比特图像;输出参数imageBit为一个3维数组,即imageBit为一个m×n×i (i = 1, 2, …, 8)... 阅读详情

给定二进制数A,下面的代码求得A中1比特的个数

int get_bit1_of_binary(int A)
{
  int count_of_bit1 = 0;

  while (A) {
    A &= A - 1;
    count_of_bit1++;
  }


  return count_of_bit1;

}

分析:上面的代码的核心部分就是其中的蓝色部分的while循环部分,其主要的思想是基于如下的事实:

1. 给定二进制数A,A-1的效果是将A的所有的1比特中的最低位序的1比特及其该比特低位序的所有0取反,而其高位的比特保持不变。

2. 给定二进制数A,A与其逐位取反的数B进行位与运算则结果为0,用C语言表示即:

X=A & ~A ;  //则X等于0

另外 A与其自身位与结果仍然为A,即A&A=A

如:

A=164,   其二进制形式为:10100100,该数中的最低位序的1比特位于右数的第3位,第3位置开始的所有低比特如蓝色部分所示

A-1=163,其二进制形式为:10100011,与上面的10100100相比较,其相当于将第3位置开始的所有低比特进行了位取反操作,如蓝色部分所示,而其高位的比特保持不变

此时 A与A-1进行位与运算:A & A - 1,相当于第3位置开始的所有低比特清零,而其高位的比特保持不变即

   10100100   (164)

   10100011  (163)

   10100000   (位与运算的结果,相当于第3位置开始的所有低比特清零,如蓝色部分所示,而其高位的比特保持不变,)

将该位与运算的结果再赋值给A,重复如上的运算,A = A & A - 1,每重复一次如上的运算过程,就将当前的最低位序的1比特进行了清零处理,相当于发现了一个1比特,循环的次数就是A中的1比特的个数 ,直到A为0结束循环,即可得到A中1比特的个数。

这个方法的执行时间仅和A中1比特的个数有关。

测试程序如下:

/*
 * bit1.c
 * to determine how many '1' bit in a binary number
 * snallie
 * 2012-11-11
 *
 */

int get_bit1_of_binary(int A)
{
  int count_of_bit1 = 0;

  while (A) {
    A &= A - 1;
    count_of_bit1++;
  }

  return count_of_bit1;
}

void dump_binary(int A)
{
  int sz=sizeof(A)*8-1;
  while(sz>=0)
    {
      printf("%c",A&(1<<sz)?'1':'0');
      sz--;
    }
}

int main( int argc , char **argv)
{
  int a;
  if (argc<2)
    {
      printf("Usage: %s Integer\n",argv[0]);
      exit(1);
    }

  a=atoi(argv[1]);    
  dump_binary(a);
  printf(" %d\n", get_bit1_of_binary(a) );
}

运行结果:

C:\>bit1
Usage: c:/bit1.exe Integer

C:\>bit1 0
00000000000000000000000000000000 0

C:\>bit1 5
00000000000000000000000000000101 2

C:\>bit1 111
00000000000000000000000001101111 6

C:\>bit1 100
00000000000000000000000001100100 3

C:\>bit1 150
00000000000000000000000010010110 4

C:\>bit1 -1
11111111111111111111111111111111 32

--本文结束--









比特的介绍 阅读详情

相关推荐

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 222

计算一个数的二进制中有几个bit是1

#include<stdio.h> #define BIT31 (0x1<<31) int calculate(unsigned int c) { int count = 0; int i = 0; unsigned int comp = BIT31; for (i = 0; i < sizeof(c) * 32; i++) { if (...

alike_meng的博客 2155

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

比特位计数--C++ bitset 用法

比特位计数前言一、示例二、代码解析1.比特位计数2.测试代码3.结果三、C++ bitset 用法1.构造函数2.一些函数3.结果总结 前言 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 一、示例 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 二、代码解析 1.比特位计数 代码如下(示例): vector<int> countBits(int

m0_46208939的博客 2462

DFT知识点扫盲——DFT scan chain

实际在项目中synccell一般直接上ULVT,既然是SDF,就是带Scan接口的DFF,SN (set negtive)是低置位,RP(reset positive)是高复位,既没有SN也没有RP的就是无复位寄存器。1:定义:满足可测试性设计(DFT),将设计中所有的触发器连接到一条或者若干条链上,称为scan chain,将一个复杂的时序电路转换为简单的组合电路进行测试,这一步是在逻辑综合(DC)中实现。当SE=1当SI=1时,电路进入scan状态,当SI=0时,电路工作在normal状态。

笨蛋大乌龟的博客 4936

2019美亚杯团体赛刷题 部分题解(1-42、106-116)

文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的

7ruth0hn的博客 7545

【android】解析dump的几种方式

在开发调试过程中,经常会遇到手机/设备crash或者dump了,memory dump是分析系统crash/dump的重要办法 在qualcomm的流程中,设备如果发生dump,会将dump的log缓存到某一个区域,用户可以利用个别工具将log取出来分析,以下就是基本qcom的基础上介绍几种获取dump log的方法: 1.T32方法 trace32 onlie软件,链接到主板/设备上,然后

Lieke的博客 2万+

标准测试测试数据STDF学习笔记

本文介绍了STDF(Standard Test Data Format)文件的结构与解析方法。首先详细说明了STDF记录的组成,包括记录头类型(REC_TYP和REC_SUB)、数据类型定义、时间日期格式以及无效数据标识。重点分析了25种主要记录类型的功能、数据内容和出现位置,如FAR、MIR、MRR等关键记录。然后介绍了基于pystdf开源工具的解析方法,包括自带脚本的使用和自编程解析流程,通过事件驱动机制处理数据流。特别指出测试数据是按照PIR→PTR/MPR/FTR→PRR的循环模式组织。文章为ATE

歌颂苦难的行为是无耻的; 1513

DumpBinary

stdafx.h #include "targetver.h" #include <stdio.h> #include <tchar.h> #include <iostream> #include <fstream> #include <string> #include <vector> #include <cstdl...

weixin_30685029的博客 201

自动识别象棋棋子的OpenCV应用

在计算机视觉领域,OpenCV是一个广泛应用的开源计算机视觉库,它提供了丰富的图像处理和分析工具。本文将介绍如何使用OpenCV实现自动识别象棋棋子的功能,并提供相应的源代码。通过以上代码,我们可以实现对棋盘图像中棋子的自动识别。需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和算法优化,以获得更好的识别效果。函数利用预处理后的图像,寻找图像中的轮廓,并根据轮廓的面积筛选出可能的棋子轮廓,最后在原图像中提取棋子区域。在主程序中,我们读取输入图像,并调用。

WzisTypescript的博客 907

05 - GRACE数据处理-球谐展开与球谐综合

GRACE数据处理-球谐展开和综合前面在介绍GRACE相关理论的时候提到过下面的公式,从公式形式上可以看出,面密度变化和球谐系数(CS)之间是能够相互转换的,那这个转化的过程可以称为球谐展开,简单理解就是将全球网格数据转化为球谐系数的过程。而球谐综合可以看作是球谐展开的逆过程,利用球谐系数计算到全球格网分布。

weixin_43339605的博客 1050

比特位操作——二进制中有多少个1

举一反三:http://blog.youkuaiyun.com/ifollowrivers/article/details/73744489  (这两道题思路一模一样) 计算在一个 32 位的整数的二进制表式中有多少个 1. 您在真实的面试中是否遇到过这个题?  Yes 样例 给定 32 (100000),返回 1 给定 5 (101),返回 2 给定

IFollowRivers 1752

【即插即用模块】注意力篇 | TGRS 2025 | SCPP:独家复现!三特征多尺度注意力融合,涨点必备!

摘要:SCPP(Scale-aware Pyramid Pooling)是一种创新的多尺度特征融合模块,专为U型网络瓶颈设计。它通过局部特征提取(1×1卷积)、多尺度膨胀卷积(1/3/5膨胀率分支)和全局特征聚合(全局平均池化)三重结构,结合SE通道注意力机制和自适应加权融合,显著提升特征表达能力。实验表明,SCPP能有效解决边缘模糊和错误检测问题,在遥感图像分割等任务中表现优异。该模块支持即插即用,适用于各类需要多尺度特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 944

快速计算某一整数中的二进制比特“1”的数目、以及定位二进制比特“1”的位置

二进制比特“1”的数目 位置

jocks的专栏 678

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

动态规划优雅计算比特位数:从0到n的二进制中1的个数

本文介绍了一种高效的动态规划算法来计算整数的二进制表示中1的个数(汉明重量)。该算法利用二进制数的特性:通过位运算(i&(i-1))检测2的幂次,并以最高有效位为基准进行动态规划转移(bits[i]=bits[i-highBit]+1)。该方法仅需O(n)时间复杂度和O(1)额外空间,代码简洁优雅(约10行),适用于位图处理、密码学等场景,是动态规划与位运算结合的经典范例。

weixin_62938484的博客 821

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

图像处理 | 比特平面分层以及图像重构

比特平面分层 1、实现思路 对于一幅8比特的图像而言,其灰度级最大值为255(对应二进制数11111111),有8位二进制位,这8个二进制分别对应每一层比特平面的灰度值(最高位对应最高阶比特平面)。因此,只要我们将图像的每一个像素点的灰度级转换为8个二进制位的数字,然后分别提取出每个二进制位数字,按照对应的位置赋值给每一个比特平面对应位置的像素即可。 具体实现步骤如下: 获取输入图像的行和列(分别记为r,c),生成一个三维零矩阵imageBit[r c 8]; 遍历原图像每一个像素点,将其值转换为8位2进

qq_45716120的博客 4939

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

求二进制数中1的个数

 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高。分析与解法大多数的读者都会有这样的反应:这个题目也太简单了吧,解法似乎也相当地单一,不会有太多的曲折分析或者峰回路转之处。那么面试者到底能用这个题目考察我们什么呢?事实上,在编写程序的过程中,根据实际应用的不同,对存储空间或效率的要求也不一样。比如在PC上的程序编写与在嵌入式设备上的程序编写就有很

lyy learn C 530

【力扣刷题实战】位1的个数

文章目录目录力扣题目: 位1的个数题目描述解题思路问题理解算法选择具体思路解题要点完整代码(C++)兄弟们共勉 !!! 每篇前言原题链接:191. 位1的个数 - 力扣(LeetCode)给定一个正整数 ,编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。示例 1: 输入:n = 11 输出:3 解释:输入的二进制串 1011 中,共有 3 个设置位。 示例 2: 输入:n = 128 输出:1 解释:输入的二进制串 10000000&nbsp

2401_85548793的博客 1030

比特平面重建图像matlab,matlab实现 图像的比特平面分层 代码

题目:自定义一个用于比特平面分层的函数,给定一副8比特灰度图像(EXP3B.tif和EXP3C.tif),输出该图像第1阶至第8阶比特平面图像。说明:函数模板为imageBit = myImageBitPlaneSlicing(img);其中,输入参数img为一幅m×n×1的8比特图像;输出参数imageBit为一个3维数组,即imageBit为一个m×n×i (i= 1, 2, …, 8)的矩阵...

weixin_36212560的博客 437

[编程之美2.1]求二进制数中1的个数

题目:对于一个字节(8bit)的无符号变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。 思路一:从十进制转化为二进制的方法中获得启发,可以余2然后判断是否为一,是则加一,再将该数除2继续之前的判断操作。 思路二:将余2和除2操作用位操作&和>>来表示,使得效率更加快 思路三:判断一个数是否为2的幂次可以用v&(v - 1)来求解,比如v = 1000000,则v-1 = 01

qingmarch 657

Polar码的C语言实现之比特反序重排篇

Part 1.为何要比特反序重排 对于使用软件模拟极化码的编译过程与结果,并不需要考虑比特反序重排的问题,但在数字电路实现中,为了便于LLR的取值,需要在编码之后,对比特序列进行反序重排。假如原本比特排序为(1,2,3,4,5,6,7,8),那么经过反序重排,得到的编码比特序列为(1,5,3,7,2,6,4,8)。 Part 2.比特反序重排原理 如上图所示,码长为8的比特序列编码一共进...

weixin_46245189的博客 1995

位运算和比特数组

枚举查找和对分查找的优劣 枚举查找的劣势简直无需多言,有n个元素,那复杂度就是o(n),查找一个元素是如此地费劲!倘若我需要你做m次查找,复杂度就是o(n*m)。当然,我们可以用对分查找来优化,但是对分查找需要一个有序的数组,通过每次对折一半的方法,最终的复杂度是o(logn),小于线性。但是这还是不能让我们满意。 在解决图论问题时,我们用到了DFS。DFS要求不能经过重复的点,所以我们需要创建一...

Martisum的博客 1649

3分钟掌握比特翻转算法:如何快速计算两个整数转换所需的比特翻转次数

比特翻转是位操作中的基础概念,在编程面试和算法竞赛中经常出现。本文将带你快速理解比特翻转算法,并通过一个实际的Python实现来展示如何计算两个整数转换所需的比特翻转次数。📈 ## 什么是比特翻转? 比特翻转(Bit Flip)指的是将二进制数中的某一位从0变为1,或者从1变为0的操作。在计算机科学中,位操作是处理底层数据的重要技能,而比特翻转算法则是检测两个整数二进制表示差异的关键技术。

gitblog_00034的博客 452

图像的比特平面分层

比特平面分层(Bit-Plane Slicing)是一种在图像处理中常用的技术,它涉及将图像的像素值表示拆分成不同的二进制位平面。这些平面可以分别表示图像中的不同特征或信息,从而在图像分析、增强和压缩等方面提供了有用的工具。对于一幅灰度图像,每个像素点的像素值可以用8位二进制数表示(通常在0到255的范围内)。比特平面分层是将这些8位二进制数拆分成8个独立的平面,每个平面对应于一个特定的二进制位。比特平面分层的主要意义在于分解图像的信息,使我们可以观察和操作图像中的不同细节和特征。,它的8位二进制表示为。

吃葡萄不吐葡萄皮 2400
上一篇: 一个简单有趣的C语言自打印程序print-me.c
下一篇: 为什么异或运算可以实现两个整数的交换,而无需借助第3个临时变量
jocks
博客等级 码龄18年 15粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值