求一个二进制表示的整数的0和1的位数

题目:输入一个整数,求其二进制表示的0和1的位数。

  • 求取整数的二进制下的0的位数

举例来说,假设一个整数我们用一个字节八位数来表示,int a=123; 则a的十六进制表示方法为a=0x7B( 0111 1011 ),去掉最低位的0的方法为 : a | (a+1)  { 0111 1011 | 0111 1100=0111 1111 },此时的a=0x7F(0111 1111),同理,运用同样的方法就可以去掉另一位0,a | (a+1)  { 0111 1111 | 1000 0000=1111 1111 },然而此循环的的终止的条件为n+1(因为把整数的0全部变成1后,再在此基础上加上1为0,例如,a=0xff; a+1=1111 1111 +0000 0001=0000 0000).程序如下:


#include<iostream>

using namespace std;
	int main() {
		int n,sum=0;
		cin >> n;
		while (n+1) {
			n = n|(n + 1);
			sum++;
		}
		cout << sum << endl;
	return 0;
}

  • 求取整数的二进制下的1的位数

由上面求取0的方法可知我们是去除0,因而求取1的个数我们是去除1,则去除1的方法为a&(a-1)。

用同样的例子,int =123;(a-1)= { 0111 1011 | 0111 1010=0111 1010 },此时a=0x7A(0111 1010),同理,继续此操作a&(a-1)={ 0111 1010 | 0111 1001= 0111 1000},a=0x78(0111 1000),继续此过程可以发现,最后整数中的1全部用0代替,最后a=0,则循环终止的条件为a=0.程序如下:

#include<iostream>

using namespace std;
	int main() {
		int n,sum=0;
		cin >> n;
		while (n) {
			n = n&(n - 1);
			sum++;
		}
		cout << sum << endl;
	return 0;
}

谨记:求一个整数二进数的位数0的关键为:a|(a+1)

         求一个整数二进数的位数0的关键为:a&(a-1).


猜你喜欢

转载自blog.csdn.net/zjx_cfbx/article/details/79755142