c语言位运算 求1个整数的二进制数有多少个1
今日见到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的个数
package _位运算;public class _位运算求整数中1的个数 {public static void main(String[] args) {int n = 4;int ans = ...
- java中取整数绝对值_Java之——位运算求整数绝对值
通过下面的位运算可以得到一个整数的绝对值 public int abs( int a ) { return (a + (a >> 31)) ^ (a >> 31) ;//前半部 ...
- (转)C语言位运算详解
地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...
- sizeof是c语言的一种运算符,C语言位运算和sizeof运算符详解
位运算和sizeof运算符 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的.位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果.位运算主要有 ...
- c语言位运算负数的实例_巧妙运用C语言位运算
原标题:巧妙运用C语言位运算 位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有: &(按位与) ...
- c语言位运算试题及解析,C语言面试题分类-位运算
1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...
- c语言位运算负数的实例_一招教你学会C语言中位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...
- C语言位运算,醍醐灌顶式教学
C语言位运算,醍醐灌顶式教学 学习计算机的都了解,位运算其实以一种比较快速的运算,对于大型应用程序,可以节约很多运算时间.但是很多人都不了解,下面我来给大家大致讲解一下C语言中各种位运算符.(小声bb ...
- c语言位运算(c语言回文数编程)
C语言的位运算 <>2;/其实这些符号都是差不多的用法;///PUR0 = PUR0 | 0X20;/,就是相当于R0CONH = R0CONH & 0XFC;/left shif ...
最新文章
- hibernate和struts2实现分页功能
- 独家 | Python利用深度学习进行文本摘要的综合指南(附教程)
- JavaWeb--MVC案例1-------(4)删除
- RMAN的show,list,crosscheck,delete 命令整理
- Scribe日志收集工具
- 涨知识!船东提单和货代提单的区别!
- 微软推Windows 10新内测版 仍以“修复”为特色
- 实现BX的内容加上123 并把和送到寄存器AX
- 数据结构课程设计------扫雷游戏(升级版,可展开)
- Window服务的创建与删除
- 编译后错误提示为pls-00103:出现符号在需要下列之一时:begin case declare
- 多语言ASR?没有什么听不懂,15种语言我全都要
- java死锁2_Java面试必问-死锁终极篇(2)
- DDWRT如何开启samba共享
- java 正则表达式 替换 html,java 正则表达式 替换 html
- matlab工具箱下载
- 苹果在高端手机市场碾压安卓手机,国产旗舰不入前十
- 《用户至上:用户研究方法与实践(原书第2版)》一2.4 理解用户
- 简单画布canvas的画法
- 第一次计算机比赛心得