位运算

/*
* 整数向右移1位和/2之间的区别:除了这个整数是-1之外其余结果都相同。
*/


#include<iostream>

using namespace std;

int main()
{
	int value = -1;

	int  result1 = value / 2;
	value = value >> 1;
	double result2 = value;

	cout <<"result1 = " << result1 << endl;      //结果为0
	cout <<"result2 = " << result2 << endl;      //结果为-1

	return 0;
}

  

/*
* 请实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。
* 例如,把9表示成二进制1001,有2位是1。因此如果输入9该函数输出2.
*/

/*
* 不适用于负整数的解法
*/

int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		if (n & 1)
			count++;

		n = n >> 1;    //除法的效率要比移位运算低很多,在实际编程中应尽可能地用移位运算符代替乘除法
	}
	return count;
}

/*
* 常规解法,适用于正整数也适用于负整数。
* 首先把n和1做与运算,判断最低位是不是1,然后把1左移一位,再与n
* 做与运算,就能判断n的次低位是不是1......这样反复左移,每次都能判断
* n的其中一位是不是1.
* 这样数据类型一共占多少位就需要移动多少位
*/

int NumberOf1(int n)
{
	int count = 0;
	unsigned int flag = 1;
	while (flag)
	{
		if (n & flag)
		{
			count++;
		}
		flag = flag << 1;
	}

	return count;
}

/*
* 整数中一共有多少个1就移动多少位。
* 概念:把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于
* 把整数的二进制表示中最右边的1变成0.
*/

int NumberOf1(int n)
{
	int count = 0;

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

	return count;
}

  

posted on 2021-11-23 08:33  xcxfury001  阅读(23)  评论(0)    收藏  举报

导航