位操作训练
1.题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数
#include<stdio.h>
int main()
{
int f(char);
char c;
int num;
printf("输入字符:");
scanf("%c",&c);
printf("%d\n",c);
num=f(c);
printf("1的个数有:%d\n",num);
return 0;
}
int f(char x)
{
int num=0;
while(x!=0)
{
if(x&1==1)
{
num++;
}
x=x>>1;
}
return num;
}
2.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位
.
#include <stdio.h>
void fun(int a, int p1, int p2)
{
int i;
int temp;
if (a < 0)
{
a = -a;
}
printf("The result:\n");
for (i = p2 - 1; i >= p1 - 1; i--)
{
if ((i + 1) % 4 == 0)
{
printf(" ");
}
temp = (a >> i) & 1;
printf("%c", (temp == 1) ? '1' : '0');
}
printf("\n");
}
int main()
{
int a;
int p1, p2;
printf("Enter a number!\n");
scanf("%d", &a);
printf("Enter p1 and p2(p1,p2<32)\n");
scanf("%d%d", &p1, &p2);
fun(a, p1, p2);
return 0;
}
3.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出.
#include <stdio.h>
void fun(int a, int p1, int p2)
{
int i;
int temp;
if (a < 0)
{
a = -a;
}
printf("The result:\n");
for (i = p2 - 1; i >= p1 - 1; i--)
{
if ((i + 1) % 4 == 0)
{
printf(" ");
}
temp = (a >> i) & 1;
printf("%c", (temp == 1) ? '0' : '1');
}
printf("\n");
}
int main()
{
int a;
int p1, p2;
printf("please enter a number:");
scanf("%d", &a);
printf("Enter p1 and p2(p1,p2<32):");
scanf("%d%d", &p1, &p2);
fun(a, p1, p2);
return 0;
}
4.题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
#include <stdio.h>
void fun(int a, int p1, int v)
{
int i;
int temp;
printf("The result:");
int k = 32;
if (a < 0)
{
a = -a;
k--;
printf("1");
}
for (i = k; i >= 1; i--)
{
if (i % 4 == 0)
{
printf(" ");
}
if (i == (32 - p1 + 1))
{
printf("%d", v);
}
else
{
temp = (a >> (i - 1)) & 1;
printf("%c", (temp == 1) ? '1' : '0');
}
}
printf("\n");
}
int main()
{
int a;
int p1, p2;
printf("Please enter a number:");
scanf("%d", &a);
printf("Enter p1(p1,p2<32) and v(0|1):");
scanf("%d%d", &p1, &p2);
fun(a, p1, p2);
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 main()
{
int i=0;
int a=0;
int b=30;
int temp=0;
printf("Please enter number:");
scanf("%d",&a);
printf("The new value generated is:\n");
if(a<0)
{ a=-a;
printf("1");
temp=1^(a>>29&1);
printf("%c",(temp==1)?'1':'0');
b--;
}
else
{
printf("0");
}
for(i=b;i>=1;i--)
{
temp=(a>>(i+1)&1)^(a>>(i-1)&1);
printf("%c",(temp==1)?'1':'0');
}
temp=a&1;
printf("%c",(temp==1)?'1':'0');
printf("\n");
}
6、将任意十进制数转化为16进制数;
#include<stdio.h>
int main()
{
int i=0;
char temp=0;
unsigned int a=0;
unsigned char mask=0x0000000f;
printf("Please enter number:");
scanf("%d",&a);
char str[11];
str[0]='0';
str[1]='X';
str[10]='\0';
for(i=0;i<8;i++)
{
temp=a>>(i*4)&mask;
if(temp<10)
{
str[9-i]=temp+'0';
}
else
{
str[9-i]=temp-10+'A';
}
}
printf("The result:\n");
printf("%s\n",str);
return 0;
}