位运算
/*
* 整数向右移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) 收藏 举报
浙公网安备 33010602011771号