位运算相关面试题

位运算的相关面试题:
面试题一:在Excel2003中,用A表示第一列,B表示第二列...........Z表示第26列,AA表示第27列,AB表示第28列..............以此类推。请写出一个函数,输入字母表示的列好编码,输出她是第几列。
思路:把十进制数字用A-Z表示成二十六进制。
int SearchRow(char* str,int length)//strlen
{ 
	//把A-Z表示成26进制;数组下标为所代表的值。
	char ch[] = {'0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//多写一个‘0’是为了让字母分别匹配他们的值,
	char* p1 = str;
	char* p2 = str+length-1;
	double count = 0.0;
	int row = 0;
	while(p1  <= p2)
	{
	  for(int i=0;i
面试题二:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制位1001,有两位是1.因此输入9该函数输出2。
思路:对于整数和整数减一进行位与运算,直到为0,进行几次位与运算就有几个位为1.
代码
int FindNumBitIs1(int num)
{
	int count = 0;
	while(num != 0)
	{
		count++;
		num = num &(num - 1);
	}
	return count;
}
面试题三:用一条语句判断一个整数是不是2的整数次方。
思路:当一个整数为2的整数次方的时候,二进制序列中只有一位为1.
代码:
bool Is2IntegerPower(int num)
{
	int count = 0;
	while(num != 0)
	{
		count++;
		num &= num-1; 
	}
	if(count == 1)
		return true;
	return false;
}
面试题四:输入两个整数m和n,计算需要改变m的额二进制表示中的多少位,才能得到n.
思路:(1)求m和n的异或结果;
           (2)求m和n异或结果中1的位数;即可得到结果。
代码:
int BitOfInt1ToInt2(int m,int n)
{
	int result = m^n;
	int count = 0;
	while(result)
	{
		count++;
		result &= (result -1);
	}
	return count;
}
小结:把一个整数减1之后再与原来的数做位“与运算”,得到的结果相当于把整数二进制表示中最右边的1变为0.


作者水平有限,如有问题,请留言,谢谢!!

你可能感兴趣的:(剑指offer)