编写代码实现:求一个整数存储在内存中的二进制中1的个数。
#include<stdio.h> int fun(int a) { int sum = 0; while (a) { if (a % 2 == 1) { sum++; } a = a / 2; } return sum; } int main() { int a = 11; printf("%d", fun(a)); return 0; }//这个方法对负数会算错,因为会按补码进行计算,若想用此方法计算负数,把函数形参改为unsigned int
#include<stdio.h> int main() { int a = 3; int sum = 0; for (int i = 0; i < 32; i++) { if ((a >> i) & 1) { sum++; } } printf("%d", sum); return 0; }
#include<stdio.h> int main() { int num = 10; int count = 0;//计数 while (num) { if (num % 2 == 1) count++; num = num / 2; } printf("二进制中1的个数 = %d\n", count); return 0; }
如1110 n
1101 n-1与一
得到 1100
反复进行
#include <stdio.h> int main() { int num = -1; int i = 0; int count = 0;//计数 while(num) { count++; num = num&(num-1); } printf("二进制中1的个数 = %d\n",count); return 0; }
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
#include <stdio.h> int main() { int a =0; int b =0; int c ; scanf("%d %d", &a, &b); int i = 0; int sum = 0; c = a ^ b; for (i = 0; i < 32; i++) { if ((c >> i) & 1) sum++; } printf("%d", sum); return 0; }
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
#include<stdio.h> void fun(int a) { int i = 0; printf("奇数:"); for (i = 31; i>=1 ; i=i-2) { printf("%d ", (a >> i) & 1); } printf("\n偶数:"); for (i = 30; i >= 0; i = i - 2) { printf("%d ", (a >> i) & 1); } } int main() { int a = 0; scanf("%d", &a); fun(a); return 0; }
赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值
x = y+1;
a = x;
复合赋值:
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
单目操作符
~按位取反讲解
按位取反是按照补码进行取反,之后转换到原码,输出的是原码的值
若想把红色位置的0变为1,我们可进行下面的操作
将1的二进制位左移1位,然后进行按位或
当我们想把下面的红色1,改为0,也就是恢复上面的操作时,我们可这样做
如何得到最后一行数字? 我们对下面这个数字按位取反即可












