天天看点

【C语言】位操作

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

#include <stdio.h>

void num(char ch)
{
    int i = 0;
    int temp=0;
    int count=0;
    for(i=0;i<8;i++)
    {
        temp = ch & 1;
	ch = ch>>1;
	if(temp==1)
	{
	    count++;
	}
    }
    printf("该字节被置为1的位的个数为%d\n",count);
}

int main()
{
    char ch;
    printf("请输入一个字节:");
    scanf("%c",&ch);
    num(ch);
    return 0;
}
           

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

#include <stdio.h>

void display(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 deal(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);
   deal(n,p1,p2,num);
   printf("n在p1到p2的位为:");
   display(p1,p2,num);
   return 0;
}
           

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

#include <stdio.h>

void display(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 deal(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);
   deal(n,p1,p2,num);
   printf("n在p1到p2的位为:");
   display(p1,p2,num);
   return 0;
}
           

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

#include <stdio.h>

int num(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);
    num(a);
    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 display(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("二进制输出:");
    display(temp);
    return 0;
} 
           

继续阅读