第1天 位运算-二进制中1的个数
来源:互联网 发布:电信网络电视中央五套 编辑:程序博客网 时间:2024/04/29 11:59
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2为是1。因为如果输入9,该函数输出2。
题目主要考察的:
位运算
对输入的范围考虑(正整数、0、负整数),通常会忽略负整数
涉及到Java位移运算:
>>(右移)
<<(左移)
&
有两种解法:
第一种是右移,左侧补0直道所有1的位都移出为止。
还有一个异常情况,如果输入的是负数,左移后左侧会填充1。
第二种是n & (n-1)刚好是移出1以后的数字
/** * 面试题10 * * 2014-1-15 */public class NumberOfInBinary {/** * 每次向右移动一位, * 如果是负数右移左侧补1, * 会陷入死循环 * * @param n 可以是负整数、0、正整数 * @return */int numberOf(int n) {int count = 0;while (n != 0) {if ((n & 1) == 1) {count++;}n >>= 1;}return count;}/** * 解决负数会死循环的BUG * 每次向左移,右侧总是补0 * * @param n * @return */int numberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ( (n & flag) != 0) {count++;}flag <<= 1;}return count;}/** * * n与n-1 相与 得到的值二进制刚好是n的值去掉1个1 * * @param n * @return */int numberOf2(int n) {int count = 0;while (n != 0) {count++;n = (n - 1) & n;}return count;}public static void main(String[] args) {boolean flag = true;NumberOfInBinary numberOfInBinary = new NumberOfInBinary();flag &= numberOfInBinary.numberOf(10) == 2;flag &= numberOfInBinary.numberOf(9) == 2;flag &= numberOfInBinary.numberOf(8) == 1;flag &= numberOfInBinary.numberOf(7) == 3;flag &= numberOfInBinary.numberOf(6) == 2;flag &= numberOfInBinary.numberOf(5) == 2;flag &= numberOfInBinary.numberOf(4) == 1;flag &= numberOfInBinary.numberOf(3) == 2;flag &= numberOfInBinary.numberOf(2) == 1;flag &= numberOfInBinary.numberOf(1) == 1;flag &= numberOfInBinary.numberOf(0) == 0;//flag &= numberOfInBinary.numberOf(-1) == 32; // 负数会陷入死循环flag &= numberOfInBinary.numberOf1(5) == 2;flag &= numberOfInBinary.numberOf1(4) == 1;flag &= numberOfInBinary.numberOf1(3) == 2;flag &= numberOfInBinary.numberOf1(2) == 1;flag &= numberOfInBinary.numberOf1(1) == 1;flag &= numberOfInBinary.numberOf1(0) == 0;flag &= numberOfInBinary.numberOf1(-1) == 32;flag &= numberOfInBinary.numberOf1(-2) == 31;flag &= numberOfInBinary.numberOf1(-3) == 31;flag &= numberOfInBinary.numberOf1(-4) == 30;flag &= numberOfInBinary.numberOf1(-5) == 31;flag &= numberOfInBinary.numberOf2(10) == 2;flag &= numberOfInBinary.numberOf2(9) == 2;flag &= numberOfInBinary.numberOf2(8) == 1;flag &= numberOfInBinary.numberOf2(7) == 3;flag &= numberOfInBinary.numberOf2(6) == 2;flag &= numberOfInBinary.numberOf2(5) == 2;flag &= numberOfInBinary.numberOf2(4) == 1;flag &= numberOfInBinary.numberOf2(3) == 2;flag &= numberOfInBinary.numberOf2(2) == 1;flag &= numberOfInBinary.numberOf2(1) == 1;flag &= numberOfInBinary.numberOf2(0) == 0;flag &= numberOfInBinary.numberOf2(-1) == 32;flag &= numberOfInBinary.numberOf2(-2) == 31;flag &= numberOfInBinary.numberOf2(-3) == 31;flag &= numberOfInBinary.numberOf2(-4) == 30;flag &= numberOfInBinary.numberOf2(-5) == 31;System.out.println(flag);}}
参考资料:
《剑指Offer》 面试题10
0 0
- 第1天 位运算-二进制中1的个数
- 位运算:二进制中1的个数
- 二进制中1的个数----位运算
- 位运算------二进制中1的个数
- 二进制数中1的个数,位运算的境界
- 统计二进制中1的个数和 - 位运算
- 剑指offer: 二进制中1的个数(位运算)
- 【剑指Offer】二进制中1的个数(位运算)
- 位运算之二进制中1的个数
- 位运算:二进制中1的个数12
- 位运算(一):二进制中1的个数
- 位运算--求一个 数二进制中1的个数
- 剑指offer_位运算---二进制中1的个数
- 二进制中1的个数 (位运算)
- 统计一个整数的二进制中1的个数(位运算技巧)
- 用位运算求给定整数的二进制表示中1的个数
- 位运算之统计一个整数的二进制中1的个数
- 位运算求解一个整数的二进制中1的个数
- 黑马程序员-网络编程UDP
- 获取IOS设备的类型和系统版本
- Pig用户自定义函数(UDF)
- 汽车4S店核算大全
- cocos2d-x 基本样条动作
- 第1天 位运算-二进制中1的个数
- Java线程_线程中断(interrupt)相关
- 第五十一天【java虐我千百遍,我待java如初恋】
- 浅谈互联网产品用户管理
- AVL树的定义和基本操作
- find 命令关于权限匹配的解释
- 从char数据类型到datetime转换导致datetime值越界
- LeetCode OJ:Palindrome Partitioning
- IOS之地图和定位应用开发