在C语言里位运算不经常用到,但不能不会。
先复习下几个基础的位运算符
与运算:&
1&0=0 1&1=1 0&0=0
或运算:|
1|0=1 1|1=1 0|0=0
异或运算:^
1^0=1 1^0=0 0^0=0
下面是五道例题,希望能帮你加深理解
1. 题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数
源代码:
#include<stdio.h>
int main()
{
int a=0,sum=0,i=0,k=1;
printf ("请输入一个字节的数,以十进制输入:\n");
scanf ("%d",&a);
if (a<0 || a>255) //一个字节占8位,因此值应该取0到255,超过则提示错误
{
printf ("error\n");
return 1;
}
for (i=1;i<9;i++) //8位逐一检测是否为1
{
if( a==(a|k) )
sum++;
k=k*2;
}
printf ("你的数化为二进制有%d个1\n",sum);
return 0;
}
结果展示:
int main()
{
int a=0,sum=0,i=0,k=1;
printf ("请输入一个字节的数,以十进制输入:\n");
scanf ("%d",&a);
if (a<0 || a>255) //一个字节占8位,因此值应该取0到255,超过则提示错误
{
printf ("error\n");
return 1;
}
for (i=1;i<9;i++) //8位逐一检测是否为1
{
if( a==(a|k) )
sum++;
k=k*2;
}
printf ("你的数化为二进制有%d个1\n",sum);
return 0;
}
结果展示:
2.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1位的值和p2位的值。并输出P1到P2位的值
源代码
#include<stdio.h>
int main()
{
int a,p1,p2,i=0,k=1,l=0,m=0,j=0;
printf ("请输入值:");
scanf ("%d",&a);
printf ("输入P1的值:");
scanf ("%d",&p1);
printf ("请输入P2的值:"); //一定要输入正整数
scanf ("%d",&p2);
for (i=1;i<p1;i++)
k=k*2;
if (a==(a|k))
printf ("P1位是1\n");
else
printf ("PI位是0\n");
k=1;
for (i=1;i<p2;i++)
k=k*2;
if (a==(a|k))
printf ("P2位是1\n");
else
printf ("P2位是0\n");
if(m>l)
{
l=m;
m=k;
}
for (i=p1;i<=p2;i++)
{ k=1;
for(j=1;j<i;j++)
k=k*2;
if (a==(a|k))
printf ("1");
else
printf ("0");
}
putchar('\n');
return 0;
}
运行结果展示
3. 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
源代码
#include<stdio.h>
int main()
{
int a,p1,p2,i=0,k=1,l=0,m=0,j=0;
printf ("请输入值:");
scanf ("%d",&a);
printf ("输入P1的值:");
scanf ("%d",&p1);
printf ("请输入P2的值:"); //一定要输入正整数
scanf ("%d",&p2);
for (i=1;i<p1;i++)
k=k*2;
if (a==(a|k))
printf ("P1位是1\n");
else
printf ("PI位是0\n");
k=1;
for (i=1;i<p2;i++)
k=k*2;
if (a==(a|k))
printf ("P2位是1\n");
else
printf ("P2位是0\n");
if(m>l)
{
l=m;
m=k;
}
for (i=p1;i<=p2;i++)
{ k=1;
for(j=1;j<i;j++)
k=k*2;
if (a==(a|k))
printf ("0"); //题目和第二题一样,只改这里就好
else
printf ("1");
}
putchar('\n');
return 0;
}
4 题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
源代码:
#include<stdio.h>
int main()
{
int a,p,v,i,k=1,l[100],g=0;
printf ("请输入值:");
scanf ("%d",&a);
printf ("请输入p值:");
scanf ("%d",&p);
printf ("请输入v值:");
scanf ("%d",&v);
for(i=1;i<p;i++) //设置一个P位为1,其他位为0的二进制
{
k=k*2;
}
if ( 0==v ) //使P位变为V值
a=a^k;
else
a=a|k;
i=0;
while (a) //将值转化成二进制输入到数组里
{
l[i]=a%2;
i++;
a=a/2;
g++;
}
for ( i=0;i<g;i++ ) //输出修改后的二进制
int main()
{
int a,p,v,i,k=1,l[100],g=0;
printf ("请输入值:");
scanf ("%d",&a);
printf ("请输入p值:");
scanf ("%d",&p);
printf ("请输入v值:");
scanf ("%d",&v);
for(i=1;i<p;i++) //设置一个P位为1,其他位为0的二进制
{
k=k*2;
}
if ( 0==v ) //使P位变为V值
a=a^k;
else
a=a|k;
i=0;
while (a) //将值转化成二进制输入到数组里
{
l[i]=a%2;
i++;
a=a/2;
g++;
}
for ( i=0;i<g;i++ ) //输出修改后的二进制
{
printf ("%d",l[g-1-i]);
}
putchar ('\n');
return 0;
}
printf ("%d",l[g-1-i]);
}
putchar ('\n');
return 0;
}
运行结果展示
5.题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
源程序
#include<stdio.h>
int main(int k,char *a[]) //从参数输入32位二进制数
{
int b[32];
int i;
for (i=1;i<31;i++) //将二进制存入实型数组
{
b[i]=(a[1][i-1]-'0')^(a[1][i+1]-'0');
}
b[0]=a[1][0]-'0'; //由于第一位和最后一位数前无数,单独列出来
b[31]=a[1][31]-'0';
for (i=0;i<32;i++)
printf ("%d",b[i]);
putchar ('\n');
}
int main(int k,char *a[]) //从参数输入32位二进制数
{
int b[32];
int i;
for (i=1;i<31;i++) //将二进制存入实型数组
{
b[i]=(a[1][i-1]-'0')^(a[1][i+1]-'0');
}
b[0]=a[1][0]-'0'; //由于第一位和最后一位数前无数,单独列出来
b[31]=a[1][31]-'0';
for (i=0;i<32;i++)
printf ("%d",b[i]);
putchar ('\n');
}
结果展示:
我也不懂这题干嘛要写32位,好烦;
~
~