码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer—算法之位运算(二进制中1的个数)

时间:2015-05-21 19:34:46      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

位运算:

左移:m<<n将m左移n位,左移后低位补充0;

右移:m>>n将m右移n位,右移后高位补充的是符号位,负数补充1,整数补充0.(正数的边界值为(1,ox7FFFFFFF),负数的边界值为(ox80000000,oxFFFFFFFF))

题目一:请实现一个函数,输入一个整数,输出这个数的二进制表示中1的个数。

思路一:将二进制数i与1相与,判断是否为1,然后将tag=1左移一位得到tag=2,然后再与i相与,循环结束的条件是tag==0;该算法的时间复杂度为输入的i的位数。

#include <iostream>
using namespace std;
int numberOf1(int n)
{
	int count=0;
	int tag=1;
	while(tag)
	{
		if(tag&n)
			count++;
		tag=tag<<1;
	}
	return count;
}

void main()
{
 
     int i;
	 while(cin>>i)
	 {
		 cout<<numberOf1(i)<<endl;
	 }
}

 思路二:把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。循环结束的条件是n为0;

#include <iostream>
using namespace std;
int numberOf1(int n)
{
	int count=0;

	while(n)
	{
		++count;
		n=(n-1)&n;
	}
	return count;
}

void main()
{
 
     int i;
	 while(cin>>i)
	 {
		 cout<<numberOf1(i)<<endl;
	 }
}

题目二:用一条语句判断一个整数是不是2的整数次方。

思路:一个整数如果是2的整数次方,那么它的二进制表示中有且仅有一个位是1,而其他所有位都是0,根据上面的分析,把这个整数减去1后再与自己相与,唯一的1也会变成0.

题目三:输入两个整数m和n,计算需要改变n的几位可以得到m。

第一步先将这m和n异或,然后再数1的个数。

题目四:在Excel2003中,用A表示第一列,用B表示第二列,用C表示第三列....用z表示第26列,AA表示第27列,用AB表示第28列.....依次类推,请写一个函数输入字母表示列号,输出是第几列。(十进制转换为26进制的问题)

 

剑指offer—算法之位运算(二进制中1的个数)

标签:

原文地址:http://www.cnblogs.com/hupp/p/4520463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!