Training2:位操作训练

Training2:位操作训练

1.题目:请编写一个c函数,该函数给出一个字节中被置为1的位的个数#include <stdio.h>

#include <stdio.h>
int func(int num)
{
int p;
int i = 0;
int count = 0;;
for(i = 0;i < 8;i++)
{
p = num % 2;
num = num / 2;
if(p == 1)
count ++;
}
return count;
}

int main()

{

char ch;
ch = getchar();
int num;
num = ch;
printf("%d\n",func(num));
}
 2.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.

#include "stdio.h"
void func(long n,int p1,int p2)
{
long t;
if(p1>p2)
{
int temp=p1;
p1=p2;
p2=temp;
}
for(t=1<<p1;t<=1<<p2;t<<=1)
{
if(n & t)
printf("1");
else 
printf("0");
}
}
int main()
{
long n;
int p1,p2;
scanf("%ld",&n);
scanf("%d%d",&p1,&p2);
func(n,p1,p2);
}

3.题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出

#include <stdio.h>  
void func(int p1,int p2,int num[])  
{  
   int n = p2 - p1;  
   int i = 0;  
   for(i=n;i>=0;i--)  
   {  
      printf("%d",num[i]);  
   }  
   printf("\n");  
}  
int funy(int n,int p1,int p2,int num[])  
{  
   int i=0;  
   int temp=0;  
   int a[32];  
   int k  = 0;  
   for(i=p1-1;i<=p2;i++)  
   {  
       temp =!((n>>i)&1);   
       num[k] = temp;  
       k++;  
   }  
}  
int main()  
{  
   int n;  
   int p1,p2;  
   int num[32]={0};  
   printf("请输入一个整数:");  
   scanf("%d",&n);  
   printf("请输入p1和p2(p1<p2):");  
   scanf("%d %d",&p1,&p2);  
   funy(n,p1,p2,num);  
   printf("n在p1到p2的位为:");  
   func(p1,p2,num);  
   return 0;  
}  

4.题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.

#include <stdio.h>  
int func(int a)  
{  
    int i=0;  
    int sum=0;  
    int n=a;  
    int x=0;  
    int temp=0;  
    for(i=0;i<32;i++)  
    {  
         x = (a>>i)&1;  
         if(i>0 && i<31)  
     {  
        if(( (n>>(i-1))&1)==((n>>(i+1))&1))  
        {  
            x=0;  
        }  
        else  
        {  
            x = 1;  
        }  
     }  
     temp = i;  
     while(temp)  
     {  
        x = x*2;  
        temp--;  
     }  
     sum = x +sum;  
    }  
    printf("使用按位异或^运算后b:%d\n",sum);  
}  
int main()  
{  
    int a,v,p1,p2;  
    printf("请输入一个整数:");  
    scanf("%d",&a);  
    func(a);  
    return 0;  
}  

5.题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果

#include <stdio.h>  
int func(int  num[])  
{  
     int i=0;  
     for(i=31;i>=0;i--)  
     {  
        printf("%d",num[i]);  
     }  
     printf("\n");  
}  
int num(int a,int v,int p1,int p2,int num[])  
{  
    int i=0;  
    int temp=0;  
    for(i=0;i<32;i++)  
    {  
       if(i<(p1-1))  
       {  
          temp = (a>>i) & 1;  
      num[i]=temp;  
       }  
       else if(i<=p2-1 && i>=p1-1)  
       {  
          num[i] = v;  
       }  
       else  
       {  
          temp = (a>>i) & i;  
      num[i] = temp;  
       }  
    }  
}  
int main()  
{  
    int a,v,p1,p2;  
    int  temp[32]={0};  
    printf("请输入一个整数:");  
    scanf("%d",&a);  
    printf("请输入v(0|1),p1,p2(p1<p2):");  
    scanf("%d %d %d",&v,&p1,&p2);  
    num(a,v,p1,p2,temp);  
    printf("二进制输出:");  
    func(temp);  
    return 0;  
}  

提示:0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值