整数的二进制表示中有多少个1的问题

原创 2015年07月11日 01:15:27

我在剑指offer上面看到这道题,看到这道题是用c++写的,但是我用java编写的时候遇到问题。

首先描述问题:

        一个整数(可以为整数也可以为负数),它的二进制表示中有多少个1,。

这道题有三道解法。

1.解法一:

       就是右移这个数,然后与1进行按位与的运算,如果是1的话,那么技术器就加1,但是如果是负数的话,因为符号位是1,所以一直向右移动的话,高位就会一直补1,所以就会进入死循环,所以要进行绝对值的处理。下面是我的代码:

/**
	 * 这种方法是通过右移操作数实现的,但是如果是负数的话,由于符号位是1,所以会出现死循环的结局,所以
	 * 这种方法不可取
	 * @param n
	 * @return
	 */
	public static int test1(int n){
		int count=n>=0?0:1;
		n=Math.abs(n);
		int tag=1;
		while(n!=0){
			if((n&tag)==1){
				count++;
			}
			n=n>>1;
		}
		return count;
	}

2.解法二:

         这种方法的思路就是让1往左移,如果每次与操作数按位相与得出的是0,那么计数器就加一,我遇到的问题就出现在这里,如10的1的个数应该是2,而-10中1的个数应该是3,因为有一个符号位,如果不加符号处理话,那么得出数应该是30,也就是有30个1,这就是与剑指offer上矛盾的地方,后来我分析原因是这样的,程序中我让左移停止的条件是,两个数相与为0就停止,因为一个整数是32位,而10应该是11111111111111111111111111111010,所以得出应该是30,所以按照剑指offer上的思路,用java是得不出正确结果的,所以还需要加符号处理,以下为我这种算法的代码:

/**
	 * 这种方法虽然不会引起死循环但是还是效率不高
	 * @param n
	 * @return
	 */
	public static int test2(int n){
		int count=n>=0?0:1;
		int tag=1;
		while(Math.abs(n)>=tag){
			if((n&tag)==0){
				count++;
			}
			tag=tag<<1;
		}
		return count;
	}

3.解法三:

           这种解法是最巧妙的能够解决很多衍生的问题,这些问题在后面说,先解释我的算法,当然也是在处理符号后,因为按照剑指offer的话对于10和-10,还是会得出2和30的结果,在符号处理之后,那么试想,一个数减去1后,是不是就会把最右端的1变成0,那么n&n-1就会连同最后一位1和之后的数据位都清零,所以说,减一次就能得出一个1,也就数有多少1,就操作几次,所以这种算法的效率最高,下面是我java的代码:

/**
	 * 这种算法是每次减去1就会使原来数字最左方的1变为0所以知道全变为0为止
	 * @param n
	 * @return
	 */
	public static int test3(int n){
		
		int count=n>=0?0:1;
		n=Math.abs(n);
		while(n!=0){
			count++;
			n=n&(n-1);
		}
		return count;
	}
	public static void main(String[] args) {
		//System.out.println(test1(-10));
		//System.out.println(test2(-10));
		System.out.println(test3(-10));
	}


写这么多就是想把我遇到的问题和大家分享,不知道大家遇到类似问题没,运用第三种解法还可以解决好多衍伸的问题,例如判断一个数是不是2的幂,因为如果是2的幂的话,那么就只有一个1,所以只需操作一次如果为0那么就是2的幂次方,再如,判断两个整数有多少位是不同的,涉及到不同那么我们必然会想到亦或,不同位亦或后肯定为1,所以又转换成求整数1的个数问题,所以第三种解法应该是比较优秀的 。这是我的一点学习心得,写的太晚了该睡了,祝大家好运连连啊。

       

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

整数的二进制表示中有多少个1

整数的二进制表示中有多少个1

一个unsigned int 数的二进制表示中有多少个1

这是一道面试题可以用以下的一些方案。 第一种是很容易想到的采用循环的方式并且与1进行位与运算,具体代码如下。  1int 数的二进制表示中有多少个1?" title="求一个unsigned ...

计算一个整数的二进制表示有多少个1(别人的最快算法)

最近看了这篇文章 的第一道题 题目本意是怎么判断这段代码的输出 int func(x) { int countx =0; while(x) { count...

[LeetCode] Hamming Distance(二进制中有多少个1)+ Number Complement(补码)

啊,又是好久没来了! 最近又开始刷leetcode,发现题目多了不少。还是从基础开始做吧。 这里是两道关于位运算的题。 1. Hamming Distance 题目链接在此 The Ham...

二进制中有多少个1?

题目计算在一个 32 位的整数的二进制表示中有多少个 1.您在真实的面试中是否遇到过这个题? Yes 样例 给定 32 (100000),返回 1给定 5 (101),返回 2给定 1023 (111...

计算出二进制数中有多少个1

计算出二进制数中有多少个1 《编程之美》这本书被很多计算机专业的学生奉为面试经典, 其中也包括我。早就听高年级学长说过,面试中的题目有80%取自《编程之美》这本书, 掌握...

求比正整数N大的最小正整数M,且M与N的二进制表示中有相同数目的1

一般最容易想到的方法就是先计算正整数N用二进制表示时1的个数count1,然后不停地计算N++用二进制表示时1的个数count2,直到碰到count1 == count2成立,代码如下: typed...

1.编程实现: 两个int(32位)整数m和n的二进制表达中, 有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7

方法一: 算法思想:由于要找两个数对应不同比特位的个数,可以先将两个数按位异或,然后再统计异或后的数中的一的个数,而统计二进制中1的个数有三种方法;1.这个数循环按位 于比它小1的数,直到这个数为...

hdu6055(计算几何)计算n个整数点中有多少个正方形

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6055题意: 有n个整数点,问这些点能组成多少个正多边形。加以推导,我们可以知道,只有是正方形时,才能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)