编程练习
1.统计32位二进制中1的个数
Numberof1()就是计算参数n的二进制补码中1有几个
int Numberof1(unsigned int n)
{
if (n != 0)
return 1+Numberof1(n&(n-1));
else
return 0;
}
int Numberof1(int n)
{
int count = 0;
while (n != 0)
{
count++;
n = n & (n - 1); //每次丢掉一个1有几个1按位与几次后就不等于-
}
return count;
}
int Numberof1(int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((n >> i) & 1)
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Numberof1(n);
printf("%d\n", ret);
return 0;
}
2.写一个代码判断一个数字是不是2的n次方
int is_2n(int n)
{
if ((n & (n - 1))==0) //去掉了1个1就是0了
return 1;
return 0;
}
int is_2n(int n)
{
int i = 0;
int onlyone = 0;
for (i = 0; i < 32; i++)
{
if ((n >> i) & 1)
onlyone++;
if (onlyone == 2)
return 0;
}
if (onlyone)
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
if (is_2n(n))
{
printf("YES!\n");
}
else
printf("NO!\n");
return 0;
}
3.求m与n二进制中不同位的个数
int dif(int m, int n)
{
int i = 0, count = 0;
for (i = 0; i < 32; i++)
{
if( ((m>>i)&1) != ((n>>i)&1))
count++;
}
return count;
}
int dif(int m, int n)
{
int ret = m ^ n; //相同为0,相异为1
//统计一下ret的二进制中有几个1,就说明m和n的二进制位中有几个位不同
int count = 0;
while (ret != 0)
{
count++;
ret = ret & (ret - 1);
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
printf("%d\n", dif(m, n));
}
4.打印整数二进制的奇数位和偶数位
void classify_print(int n)
{
int i = 0;
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);
}
}
int main()
{
int n = 0;
scanf("%d",&n);
//获取n的2进制中的奇数位和偶数位
classify_print(n);
return 0;
}
5.交换两个变量(不创建临时变量)
void exchange(int* a, int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
int main()
{
int a = 3;
int b = 5;
exchange(&a, &b);
printf("a = %d b = %d\n", a, b);
}
操作系统可以使用的最大内存空间
32位平台:2^32字节
64位平台:2^64字节
(一个内存单元是一个字节,32(64)个地址线可以产生2^32(64)个地址,一个地址访问一个内存单元,因此最大2^32(64)(2^64)的最大内存空间)