目录
1.自定义函数
要求:1)初始化数组
2)输出函数
3)逆序
void init(int arr[],int sz)
{
int i = 0 ;
for (i = 0; i < sz; i++)
{
arr[i] = 0;
}
}
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
printf("\n");
}
void reverse(int arr[], int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print(arr, sz);
reverse(arr,sz);
print(arr, sz);
init(arr,sz);
print(arr, sz);
return 0;
}
2.交换数组(假设两个数组一样大)
int main()
{
int arr1[7] = { 1,2,3,4,5,6,7 };
int arr2[7] = { 11,12,13,14,15,16,17 };
int i = 0;
int sz = sizeof(arr1) / sizeof(arr1[0]);
while (i < sz)
{
int tmp = 0;
tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
i++;
}
return 0;
}
3.计算一个整数二进制中1的个数
上面两种的问题是:如果是-1的话就会出错。
修改:
int my_back(int n)
{
int count = 0;
int i = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
因为n &( n - 1)就会去掉一个1。
4.判断一个数字是不是2的n次方
int juge(int n)
{
if ((n & (n - 1)) == 0)
{
return 0;
}
else
{
return 1;
}
}
int main()
{
int num = 9;
int ret = juge(num);
if (ret == 0)
{
printf("%d是2的次方:",num);
}
else
{
printf("%d不是2的次方:", num);
}
return 0;
}
5.比较两个整数有多少个不同的二进制位
int m = 10;//1010
int n = 15;//1111
int count = 0;
scanf_s("%d %d", &m, &n);
for (int i = 0; i < 32; i++)
{
if(((m >> i) & 1) != ((n >> i) & 1))
{
count++;
}
}
printf("%d", count);
优化:
int m = 10;//1010
int n1 = 15;//1111
int count = 0;
int n = m ^ n1;
//统计一下n中有几个1,就说明m和n的二进制有几个不同的位
while ( n )
{
n = n & (n - 1);
count++;
}
printf("%d", count);
6.打印整数二进制的技奇数位和偶数位
int m = 10;
int i = 0;
//打印偶数位
for (i = 31;i >= 1 ; i-=2)
{
printf("%d", (m >> i) & 1);
}
//打印奇数位
for (i = 30; i >= 0; i -= 2)
{
printf("%d", (m >> i) & 1);
}