一,请编写一个 c 函数,该函数给出一个字节中被置为 1的位的个数
代码语言:javascript复制#include <stdio.h>
int fun(char c)
{
int i, count = 0;
for (i = 0;i < 8;i )
{
if (c & 1)
{
count ;
}
c >>= 1;
}
return count;
}
int main()
{
char c;
printf("Please input :n");
scanf("%c", &c);
printf("%dn", fun(c));
return 0;
}
二,输入一个整数 a,再输入两个整数 p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1 到 p2位
代码语言:javascript复制#include<stdio.h>
int main()
{
int a;
int p1,p2;
int i;
printf("please input:");
scanf("%d", &a);
printf("please input the station of p1,p2n");
scanf("%d", &p1);
scanf("%d", &p2);
if(p1 < p2 && p2 < 32 && p1 > 0)
{
for(i = 1;i < p1;i )
{
a = a >> 1;
}
for(i = 0;i <= p2 - p1;i )
{
printf("%d ",a & 1);
a = a >> 1;
}
printf("n");
}
else
{
printf("error input");
}
return 0;
}
三,输入一个整数 a,再输入两个整数 p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的 p1到 p2位取反后输出
代码语言:javascript复制#include <stdio.h>
int main()
{
int a;
int p1,p2;
int i;
printf("please input:");
scanf("%d",&a);
printf("please inpt p1,p2 to negationn");
scanf("%d", &p1);
scanf("%d", &p2);
if(p1 < p2 && p2 < 32)
{
for(i = 1;i < p1;i )
{
a = a >> 1;
}
for(i = 0;i <= p2 - p1;i )
{
printf("%d ",a & 1 ^ 1);
a = a >> 1;
}
}
else
{
printf("error input");
}
return 0;
}
四,输入一个整数 a,再输入两个整数 p(p<32),v(0|1),将该整数 a 的 p 位设置为 v, 输出修改后的该整数的二进制表示
代码语言:javascript复制#include<stdio.h>
void outChange(int n)
{
if(n == 0)
{
return;
}
else
{
outChange(n >> 1);
printf("%d",n & 1);
}
}
int main()
{
int a,p,v,i;
printf("please input integer:");
scanf("%d",&a);
printf("input the station of p:");
scanf("%d",&p);
printf("to 0 or 1?");
scanf("%d",&v);
int a1 = a,a2 = a;
int v1 = v;
if(p < 32 && (v == 0 || v == 1))
{
if(v == 0)
{
for(i = 1;i <= 32;i )
{
if(i != 33 - p)//第p位为0,其余为1
{
v = v << 1;
v = v ^ 1;
}
else
{
v = v << 1;
}
}
a = a & v;
}
else
{
for(i = 0;i < p - 1;i )//第p位为1,其余为0
{
v = v << 1;
//printf("%d ",v);
}
a = a | v;
//printf("n");
}
}
else
{
printf("error input");
}
outChange(a);
return 0;
}
五,输入一个 32 位的整数 a,使用按位异或^运算,生成一个新的 32 位整数 b,使得该整数 b 的每一位等于原整数 a中该位左右两边两个 bit 位的异或结果
代码语言:javascript复制#include<stdio.h>
void outChange(int n)
{
if(n == 0)
{
return;
}
else
{
outChange(n >> 1 );
printf("%d",n & 1);
}
}
int main()
{
int a,b;
int i,j;
int b_bit;
printf("please input integer:");
scanf("%d", &a);
int a_back;
int a_left,a_right;
for(i = 0;i < 32;i )//计算左右异或结果
{
a_back = a;
if(i == 31)//取最低位的左右位
{
a_right = 0;
a_left = (a_back >> 1) & 1;
}
else
{
for(j = 0;j < 30 - i;j )//从第32位依次向前
{
a_back = a_back >> 1;
}
a_left = a_right = a_back;
a_right = a_right & 1;
a_left = a_left >> 2;
a_left = a_left & 1;
}
// printf("第%d位左边为%d,右边为%dn",32-i,a_left,a_right);
b = b << 1;
b_bit = a_left ^ a_right;
b = b | b_bit;
}
printf("异或生成的b为:");
outChange(b);
return 0;
}