C中几道位运算的例题

在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;
}
结果展示:



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++ )       //输出修改后的二进制
{
  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');
}
结果展示:

我也不懂这题干嘛要写32位,好烦;







~                                                                                                                                                                                              
~                          


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值