#include<stdio.h>
int main() {
int a, b, c;
a = 5;
c = ++a;//c=6 a=6
b = ++c, c++, ++a, a++;//注意:有逗号表达式 c=8 b=7 a=8
b += a++ + c;//a=9 b=23
printf("a = %d b = %d c = %d\n", a, b, c);
//9 23 8
return 0;
}
2,写一个函数返回参数二进制中的1的个数
复制代码
#include<stdio.h>
//写一个函数返回参数二进制中的1的个数
// 方法一
//int count_num_of_1(int n) {
// int count = 0;
// while (n) {
// if ((n%2)==1)
// {
// count++;
// }
// n /= 2;
// }
// return count;
//}
//注意 -1
//1000000000000000000000000000000000000000000001
//1111111111111111111111111111111111111111111110
//1111111111111111111111111111111111111111111111 -1的补码
//对上述代码做了一点修改
//int count_num_of_1(unsigned int n) {
// int count = 0;
// while (n) {
// if ((n % 2) == 1)
// {
// count++;
// }
// n /= 2;
// }
// return count;
//}
//方法二(效率不高,循环32次)
//int count_num_of_1(int n) {
// int i = 0;
// int count = 0;
// for ( i = 0; i < 32; i++)
// {
// if (((n>>i)&1)==1)
// {
// count++;
// }
// }
// return count;
//}
//方法三(不容易想,但是非常牛)
//n=15
//n=n&(n-1)
//1111 n
//1110 n-1
//1110 n
//1101 n-1
//1100 n
//1011 n-1
//1000 n
//0111 n-1
//0000 n
int count_num_of_1(int n) {
int count = 0;
while (n) {
n = n & (n - 1);
count++;
}
return count;
}
int main() {
int num = 0;
scanf("%d", &num);
int n = count_num_of_1(num);
printf("%d\n", n);
return 0;
}
3,两个整数的二进制表达中,有多少个(bit)位不同
复制代码
#include<stdio.h>
//两个整数的二进制表达中,有多少个(bit)位不同
//方法一
//int count_diff_bit(int m,int n) {
// int count = 0;
// int i = 0;
// for ( i = 0; i < 32; i++)
// {
// if (((m>>i)&1)!=((n>>i)&1))
// {
// count++;
// }
// }
// return count;
//}
////方法二(异或操作符)
int count_diff_bit(int m, int n) {
int count = 0;
// ^ 异或操作符
//相同为0,相异为1
int ret = m ^ n;
//统计一下ret中的二进制位有几个
while (ret) {
ret = ret & (ret - 1);
count++;
}
return count;
}
int main() {
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = count_diff_bit(m, n);
printf("%d\n", ret);
return 0;
}
4,打印整数二进制的奇数位和偶数位
复制代码
#include<stdio.h>
//打印整数二进制的奇数位和偶数位
//题目:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二机制序列
//
//10
//00000000000000000000000000001010
int main() {
int i = 0;
int num = 0;
scanf("%d", &num);
//获取奇数位的数字
for ( i = 30; i >= 0; i-=2)
{
printf("%d ", (num >> i) & 1);
}
printf("\n");
//获取偶数位的数字
for ( i = 31; i >=1; i-=2)
{
printf("%d ", (num >> i) & 1);
}
return 0;
}