1.题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数
#include <stdio.h>
void count1(int a)
{
int count = 0;
while (a)
{
count++;
a = a & a - 1;
}
printf("输入的数共有%d位被置1\n", count);
}
int main()
{
int num;
printf("输入n的值 :\n");
scanf("%d", &num);
count1(num);
return 0;
}
2.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
#include <stdio.h>
int choosep1_p2(int a, int p1, int p2)
{
int temp;
int n = p2;
if (p1 > p2 || p2 > 32)
{
printf("输入的p1或p2的值不符合要求\n");
return 0;
}
printf("输出结果为 :\n");
for (; n >= p1; n--)
{
temp = (a >> n) & 1;
printf("%c", (temp == 1) ? '1' : '0');
}
printf("\n");
return 0;
}
int main()
{
int a;
int p1;
int p2;
printf("输入整数a :\n");
scanf("%d", &a);
printf("输入整数p1, p2 :\n");
scanf("%d,%d", &p1, &p2);
choosep1_p2(a, p1, p2);
return 0;
}
3.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
方法和第二题差不多,只是在第二题的基础上加了一个取反的判断
#include <stdio.h>
int choosep1_p2(int a, int p1, int p2)
{
int temp;
int n = p2;
if (p1 > p2 || p2 > 32)
{
printf("输入的p1或p2的值不符合要求\n");
return 0;
}
printf("输出结果为 :\n");
for (; n >= p1; n--)
{
temp = (a >> n) & 1;
printf("%c", (temp == 0) ? '1' : '0');
}
printf("\n");
return 0;
}
int main()
{
int a;
int p1;
int p2;
printf("输入整数a :\n");
scanf("%d", &a);
printf("输入整数p1, p2 :\n");
scanf("%d,%d", &p1, &p2);
choosep1_p2(a, p1, p2);
return 0;
}
4.题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
#include <stdio.h>
int changep_v(int a, int p, int v)
{
int temp;
int n = p;
int count = 0;
if (p >= 32 || (v != 0 && v != 1))
{
printf("输入的p或v的值不符合要求\n");
return 0;
}
printf("输出结果为 :\n");
for (n = 32; n >= 1; n--)
{
temp = (a >> (n - 1)) & 1;
count++;
if (count == 32 - p)
{
temp = v;
}
printf("%c", (temp == 1) ? '1' : '0');
if (count % 4 == 0)
{
printf(" ");
}
}
printf("\n");
return 0;
}
int main()
{
int a;
int p;
int v;
printf("输入整数a :\n");
scanf("%d", &a);
printf("输入整数p(p < 32), v(0 | 1) :\n");
scanf("%d,%d", &p, &v);
changep_v(a, p, v);
return 0;
}
5.题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
提示:0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1;
#include <stdio.h>
int xora_b(int a)
{
int n;
int temp1;
int temp2;
int temp3;
int count = 0;
printf("输出结果为 :\n");
for (n = 31; n >= 0; n--)
{
temp1 = (a >> (n + 1)) & 1;
temp2 = (a >> (n - 1)) & 1;
temp3 = (a >> n) & 1;
temp1 = temp1 ^ temp2;
count++;
if (n == 31 || n == 0)
{
printf("%c", (temp3 == 1) ? '1' : '0');
}
else
{
printf("%c", (temp1 == 1) ? '1' : '0');
}
if ((count % 4) == 0)
{
printf(" ");
}
}
printf("\n");
return 0;
}
int main()
{
int a;
printf("输入a的值 :\n");
scanf("%d", &a);
xora_b(a);
return 0;
}
6.题目:将任意十进制数转化为16进制数;
#include <stdio.h>
void int16bin(int num)
{
char a[11];
int n = 0;
int p = 9;
unsigned mask = 0x0000000f;
a[0] = '0';
a[1] = 'x';
a[10] = '\0';
printf("转化成的十六进制数为:\n");
for (; n < 32; n += 4)
{
if (((num >> n) & mask) < 10)
{
a[p] = ((num >> n) & mask) + '0';
}
else
{
a[p] = ((num >> n) & mask) + 'A' - 10;
}
p--;
}
for (n = 0; n < 11; n++)
{
printf("%c", a[n]);
}
printf("\n");
}
int main()
{
unsigned int num;
printf("输入十进制整数 :\n");
scanf("%d", &num);
int16bin(num);
return 0;
}