位运算--一个整数的二进制表示中1的个数
来源:互联网 发布:软件腰带剑开刃报价 编辑:程序博客网 时间:2024/05/11 20:19
题意:请实现一个函数,输入一个整数,输出该数二进制表示中1 的个数。例如把9 表示成二进制是1001,有2 位是1,因此如果输入9,该输出2 。
解法一:flag=1,将整数n与flag做位与,判断位与结果是否为1,为1则计数加一;flag左移一位,再重复前面步骤,直到flag为0。要循环机器字的位数次。这是常规解法,但不算最优解。
解法二:注意到一个二进制数减一后,该数的第一个非0位会变成0,该非0位的右边的所有位都由0变成1,左边的所有位保持不变。然后将减一后的数与减一前的数做位与,这样就将减一前的数的最右边的非0位变为0,其他位保持不变。所以通过这种方式就能统计出一个二进制数中1的位数。代码如下:
int numberOfOne(int n){int count;while(n){count++;n=(n-1)&n;}return count;}技巧:把一个整数减去1 之后再和原来的整数做位与运算, 得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思总解决。
扩展:(1)用一条语句判断一个整数是不是2 的整数次方。一个整数如果是2的整数次方, 那么它的二进制表示中有且只有一位是1, 而其他所有位都是0 。 根据前面的分析, 把这个整数减去1 之后再和它自己做与运算,这个整数中唯一的1 就会变成0。
(2)输入两个整数m 和n ,计算需要改变m 的二进制表示中的多少位才能得到n . 比如10 的二进制表示为1010 ,13的二进制表示为1101,需要改变1010 中的3 位才能得到1101 . 我们可以分为两步解决这个问题:第一步求这两个数的异或, 第二步统计异或结果中1的位数。
0 0
- 位运算--一个整数的二进制表示中1的个数
- 用位运算求给定整数的二进制表示中1的个数
- 位运算之求整数二进制表示中1的个数
- 一个整数的二进制表示中1的个数
- 求一个整数的二进制表示中1的个数
- C语言位运算应用一:求一个数的二进制表示中1的个数
- 寻找一个整数二进制表示中1的个数
- 一个整数N二进制表示中1的个数
- 一个整数二进制表示中1的个数 java实现
- 统计一个整数的二进制中1的个数(位运算技巧)
- 位运算之统计一个整数的二进制中1的个数
- 位运算求解一个整数的二进制中1的个数
- 统计一个整数的二进制中1的个数(位运算技巧)
- 位运算之统计一个整数的二进制中1的个数
- 【位操作】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
- 整数二进制表示中1的个数
- 整数二进制表示中1的个数
- 整数二进制表示中1的个数
- hive的配置与使用
- python学习笔记(三)
- cocos2dx-2.x 打包APK(学习笔记 Python + JDK + ADT + NDK )
- ignore 用法
- 黑马程序员——Java集合框架(2)
- 位运算--一个整数的二进制表示中1的个数
- 删除一个服务
- 搭建一个免费的,无限流量的Blog----github Pages和Jekyll入门
- LeetCode: Search in Rotated Sorted Array
- Set中equals()和hashCode()
- DB2 v10.5 EXPLAIN TABLES
- 数据结构之链栈
- TCP/IP详解--TCP的分段和IP的分片
- iOS常用静态库操作命令