一、内存存储
1、位段的理解
题目:求运行结果
求运行结果()
不同编译器结果可能不一样,因为位段占用的bit空间不确定是从每个字节的开头往高地址用还是每个字节的结尾往小地址用。
所以结果为:02 29 00 00
2、大小端、联合
题目:按照小端字节序存储,问输出的结果
二、操作符
1、按位操作符
题目:统计二进制中1的个数
思路:
代码如下:
#include <stdio.h>
int count(int a)
{
int n = 0;
for (int i = 0; i < 32; i++)
{
if ((a & (1 << i)) != 0)
n++;
}
return n;
}
int main()
{
int a = 0;
scanf("%d", &a);
int num = count(a);
printf("%d\n", num);
return 0;
}
2、按位操作符
题目:打印整数二进制的奇数位和偶数位。
思路:
代码实现:
#include <stdio.h>
void print(int a)
{
int i = 0;
printf("打印奇数二进制位:");
while (i < 32)
{
if ((a & (1 << i)) == 0)
{
printf("0");
}
else
printf("1");
i += 2;
}
printf("\n打印偶数二进制位:");
i = 1;
while (i < 32)
{
if ((a & (1 << i)) == 0)
{
printf("0");
}
else
printf("1");
i += 2;
}
}
int main()
{
int a = 0;
scanf("%d", &a);
print(a);
return 0;
}
3、按位异或(^),移位操作符
题目:找单身狗:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,编写一个函数找出这两个只出现一次的数字。
知识点:
思路:
代码实现:
//找单身狗
#include <stdio.h>
#include <stdlib.h>
void FindDog(int* arr1, int sz)
{
int sum = 0;
int tep = 0;
int* arr2 = NULL;
int* arr3 = NULL;
arr2 = calloc(sz,sizeof(int));
if (arr2 == NULL)
{
return;
}
arr3 = calloc(sz, sizeof(int));
if (arr3 == NULL)
{
return;
}
for (int i = 0; i < sz; i++)
{
sum ^= arr1[i];
}//先找出数组中两个单身狗按位异或的值。
for (int i = 0; i < 32;i++)
{
if ((sum & (1<<i)) != 0)//跟0比,如果!=0,说明二进制中第i位不是0
{
tep = i;
break;
}
}//找出两个单身狗按位异或的值的二进制位中不一样的一项,以这一项为分界,分为两部分,那么这两个数会位于不同的部分。
for (int i = 0; i < sz; i++)
{
if ((arr1[i] & (1 << tep)) == 0)//分组,二进制中第i位是0的放一起,不是的放一起
{
arr2[i] = arr1[i];
}
else
{
arr3[i] = arr1[i];
}
}
int m = 0;
for (int i = 0; i < sz; i++)
{
m ^= arr2[i];//寻找两个单身狗按位异或后的二进制序列里不相同的一项。
}
printf("%d\n", m);//打印本数组中的单身狗
int n = 0;
for (int i = 0; i < sz; i++)
{
n ^= arr3[i];
}
printf("%d\n", n);//打印本数组中的单身狗
}
int main()
{
int arr[] = {1,1,2,2,4,6};
FindDog(arr, sizeof(arr)/sizeof(arr[0]));
return 0;
}
三、总结
✨✨请点击下面关注大魔王✨✨
❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥大魔王.❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥❤️🔥