# C语言学习记录——操作符习题、算数转换习题，多解法&优解法&单选题

## 一、统计一个数二进制中1的个数

### 第一种解法

#include <stdio.h>
int NumberOf1(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n /= 2;
}
return count;
}
int main()
{
int n = 15;
printf("%d\n", NumberOf1(n));
return 0;
}

//15 % 2 = 1 15的二进制00001111//15 / 2 = 7

//7 % 2 = 1 7的二进制00000111

//7 / 2 = 3

//3 % 2 = 1 3的二进制00000011

//3 / 2 = 1

//1 % 2 = 1 1的二进制00000001

//1 / 2 = 0

### 第二种解法

#include <stdio.h>
int NumberOf1(int n)
{
int count = 0,i;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
count++;
}
return count;
}
int main()
{
int n = -1;
printf("%d\n", NumberOf1(n));
return 0;
}

//15         00000000000000000000000000001111 原码
//           00000000000000000000000000001111 反码
//           00000000000000000000000000001111 补码
//1          00000000000000000000000000000001
//15&1       00000000000000000000000000000001

//15>>1      00000000000000000000000000000111
//1          00000000000000000000000000000001
//(15>>1)&1  00000000000000000000000000000001
//......

//-1         10000000000000000000000000000001 原码
//           11111111111111111111111111111110 反码
//           11111111111111111111111111111111 补码
//1          00000000000000000000000000000001
//-1&1       00000000000000000000000000000001

//-1>>1      11111111111111111111111111111111
// 1         00000000000000000000000000000001
//(-1>>1)&1  00000000000000000000000000000001
// ......
//将-1依次>>32位，计算出所有的1就结束

### 第三种解法（优解）

#include <stdio.h>
int NumberOf1(int n)
{
int count = 0;
do
count++;
while (n = n & n - 1);
return count;
}
int main()
{
int n = -1;
printf("%d\n", NumberOf1(n));
return 0;
}

//15            1111
//15-1 = 14     1110
//15&14         1110
//n = 15%14

//15&14         1110
//(15&14)-1     1101
//两数&          1100
//n = (15&14)&((15&14)-1)

//n             1100
//n-1           1011
//n&n-1         1000
//n = n&n-1

//n             1000
//n-1           0111
//n&n-1         0000
//n = n&n-1
//n == 0

//如此反复运行n = n&n-1，直到n = 0时停止
//因而n&n-1能去掉一个数二进制中的一个1

### 相关问题

#include <stdio.h>
int main()
{
int n = 2048;
if ((n & n - 1) == 0)
printf("该数是2的n次方\n");
else
printf("该数不是2的n次方\n");
return 0;
}

## 二、求两个数二进制中不同位的个数

### 第一种解法

#include <stdio.h>
int main()
{
int m = 0, n = 0, count = 0, i = 0;
scanf("%d %d", &m, &n);
for (i = 0; i < 32; i++)//循环32次
{
if (((m >> i) & 1) != ((n >> i) & 1))//第一个整数与第二个整数二进制位不同时count++
count++;
}
printf("%d\n", count);
return 0;
}

### 第二种解法（优解）

#include <stdio.h>
int NumberOf1(int n)
{
int count = 0;
do
count++;
while (n = n & n - 1);
return count;
}
int main()
{
int m = 0, n = 0, count = 0, ret = 0;
scanf("%d %d", &m, &n);
ret = m ^ n; //相同的取0，不相同的取1
printf("%d\n", NumberOf1(ret));
return 0;
}

## 三、打印整数二进制的奇数位和偶数位

### 解法

#include <stdio.h>
int main()
{
int n,i;
scanf("%d", &n);
//打印偶数位
for (i = 31; i >= 1; i -= 2)
printf("%d ", (n >> i) & 1);
printf("\n");
//打印奇数位
for (i = 30; i >= 0; i -= 2)
printf("%d ", (n >> i) & 1);
return 0;
}

## 四、交换两个变量（不创建临时变量）

### 第一种解法

#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("a = %d\nb = %d\n\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a = %d\nb = %d\n", a, b);
return 0;
}

### 第二种解法（优解）

#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("a = %d\nb = %d\n\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d\nb = %d\n", a, b);
return 0;
}

## 五、（单选题）

### 题目内容

A.32位下：4,4,2^32 64位下：8,8,2^64

B.32位下：4,4，不限制 64位下：4,8，不限制

C.32位下：4,4,2^32 64位下：4,8,2^64

D.32位下：4,4,2^32 64位下：4,4,2^64

## 六、（单选题）判断代码输出的结果

### 题目内容

#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
short* p = (short*)arr;
int i = 0;
for (i = 0; i < 4; i++)
{
*(p + i) = 0;
}
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
A.1 2 3 4 5B.0 0 3 4 5C.0 0 0 0 5D.1 0 0 0 0

### 解析

|
14天前
|
C语言

17 1
|
19天前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
15 2
|
19天前
|

c语言学习历程【1】
c语言学习历程【1】
16 1
|
20天前
|

【C语言】：中移位操作符，位操作符详运算规则详解
【C语言】：中移位操作符，位操作符详运算规则详解
10 1
|
17天前
|
IDE 编译器 开发工具

10 0
|
18天前
|
C语言
C语言学习练习代码
C语言学习代码
|
20天前
|

【C语言】：巧用移位操作符，位操作符解决问题
【C语言】：巧用移位操作符，位操作符解决问题
13 0
|
20天前
|

【C语言】：sizeof操作符的使用和各种常见数据类型的大小
【C语言】：sizeof操作符的使用和各种常见数据类型的大小
15 0
|
2天前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
|
3天前
|

8 1