今日见到1个函数, 它的作用是求1个整数的二进制数有多少个1.

函数如下:

unsigned long fun(unsigned long x)
{int count =  0 ;while(x){count++;x =  x  &   (x - 1);}return count;
}

看了半小时才看懂, 关键是那个 x = x & (x - 1)的意就是把x 化为二进制数后, 把最右边的1变成0.

这样整个函数就很容易明白了。

问题就是 x = x & (x - 1) 为何会把x 的二进制最右边的1变成0呢?

首先& 是1个位运算符, 注意跟逻辑运算符 && 的区别啊。

& 的叫做“位与”, 它的规则就是 如果两个位都是1 则返回1, 否则返回0

也就是说

1 & 1 == 1;

0 & 0 == 0;

1 & 0 == 0;

0 & 1 == 0;

10011101

& 10101000

——————————

10001000

我们把假定 x 的二进制数是A1B, 其中B是n个0(n是任意非负整数)。 而A不受限制

假如 A是1001  B是3个0, 那么 x就是 10011000了

而且A和B中间那个1就是这个二进制数的最右边的1, 因为B是n个0嘛。

那么 x-1 就肯定是  A0C了, C是n个1.

比如 上面的例子 10011000 - 1 == 10010111 所以 C就是3个1了。

所以x & (x -1) 就是

A1B

& A0C

___________

A0B

就如     10011000

& 10010111

————————

10010000

最终A0B  比起A1B就是去掉最右边的1个1啊, 就是这样证明的。

https://sgsinm02.tcs.com/

c语言位运算 求1个整数的二进制数有多少个1相关推荐

  1. 位运算求整数中二进制1的个数

    package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...

  2. java中取整数绝对值_Java之——位运算求整数绝对值

    通过下面的位运算可以得到一个整数的绝对值 public int abs( int a ) { return (a + (a >> 31)) ^ (a >> 31) ;//前半部 ...

  3. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  4. sizeof是c语言的一种运算符,C语言位运算和sizeof运算符详解

    位运算和sizeof运算符 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的.位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果.位运算主要有 ...

  5. c语言位运算负数的实例_巧妙运用C语言位运算

    原标题:巧妙运用C语言位运算 位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有: &(按位与) ...

  6. c语言位运算试题及解析,C语言面试题分类-位运算

    1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...

  7. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

  8. C语言位运算,醍醐灌顶式教学

    C语言位运算,醍醐灌顶式教学 学习计算机的都了解,位运算其实以一种比较快速的运算,对于大型应用程序,可以节约很多运算时间.但是很多人都不了解,下面我来给大家大致讲解一下C语言中各种位运算符.(小声bb ...

  9. c语言位运算(c语言回文数编程)

    C语言的位运算 <>2;/其实这些符号都是差不多的用法;///PUR0 = PUR0 | 0X20;/,就是相当于R0CONH = R0CONH & 0XFC;/left shif ...

最新文章

  1. hibernate和struts2实现分页功能
  2. 独家 | Python利用深度学习进行文本摘要的综合指南(附教程)
  3. JavaWeb--MVC案例1-------(4)删除
  4. RMAN的show,list,crosscheck,delete 命令整理
  5. Scribe日志收集工具
  6. 涨知识!船东提单和货代提单的区别!
  7. 微软推Windows 10新内测版 仍以“修复”为特色
  8. 实现BX的内容加上123 并把和送到寄存器AX
  9. 数据结构课程设计------扫雷游戏(升级版,可展开)
  10. Window服务的创建与删除
  11. 编译后错误提示为pls-00103:出现符号在需要下列之一时:begin case declare
  12. 多语言ASR?没有什么听不懂,15种语言我全都要
  13. java死锁2_Java面试必问-死锁终极篇(2)
  14. DDWRT如何开启samba共享
  15. java 正则表达式 替换 html,java 正则表达式 替换 html
  16. matlab工具箱下载
  17. 苹果在高端手机市场碾压安卓手机,国产旗舰不入前十
  18. 《用户至上:用户研究方法与实践(原书第2版)》一2.4 理解用户
  19. 简单画布canvas的画法
  20. 第一次计算机比赛心得

热门文章

  1. python操作mysql操作步骤
  2. 02-Linux Kernel(armv8-aarch64)的原子操作的底层实现
  3. 嵌入式编程-C语言使用小技巧
  4. [私]-optee的同步方法
  5. C++实现插入排序算法
  6. 1.22 实例:商品信息查询
  7. 将数字字符串格式化为指定长度
  8. 1113 Integer Set Partition (25 分)【难度: 一般 / 知识点: 思维 贪心】
  9. linux之source
  10. JavaScript事件与jQuery方法