位运算训练

2022-11-15 13:56:01 浏览数 (2)

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

代码语言:javascript复制
#include <stdio.h>
 
int fun(char c)
{	
	int i, count = 0;
 
	for (i = 0;i < 8;i  )		
	{								
		if (c & 1)
		{
			count  ;
		}
		c >>= 1;
	}
	return count;
}

int main()
{
	char c;
	printf("Please input :n");
	scanf("%c", &c);
	printf("%dn", fun(c));
	
	return 0;
}

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

代码语言:javascript复制
#include<stdio.h>
int main()
{
    int a;
	int p1,p2;
	int i;
	printf("please input:");
	scanf("%d", &a);
	printf("please input the station of p1,p2n");
	scanf("%d", &p1);
	scanf("%d", &p2);
	if(p1 < p2 && p2 < 32 && p1 > 0)
	{
		for(i = 1;i < p1;i  )
		{
			a = a >> 1;
		}
		for(i = 0;i <= p2 - p1;i  )
		{
			printf("%d ",a & 1);
			a = a >> 1;
		}
		printf("n");
	}
	else
	{
		printf("error input");
	}
	return 0;
}

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

代码语言:javascript复制
#include <stdio.h>
int main()
{	
    int a;
	int p1,p2;
	int i;
	printf("please input:");
	scanf("%d",&a);
	printf("please inpt p1,p2 to negationn");
	scanf("%d", &p1);
	scanf("%d", &p2);
	if(p1 < p2 && p2 < 32)
	{
		for(i = 1;i < p1;i  )
		{
			a = a >> 1;
		}
		for(i = 0;i <= p2 - p1;i  )
		{
			printf("%d ",a & 1 ^ 1);
			a = a >> 1;
		}
	}
	else
	{
		printf("error input");
	}
	return 0;
}

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

代码语言:javascript复制
#include<stdio.h>
void outChange(int n)
{
	if(n == 0)
	{
		return;
	}
	else
	{
		outChange(n >> 1);
		printf("%d",n & 1);
	}
}
 
int main()
{
	int a,p,v,i;
	printf("please input integer:");
	scanf("%d",&a);
	printf("input the station of p:");
	scanf("%d",&p);
        printf("to 0 or 1?");
	scanf("%d",&v);
	
	int a1 = a,a2 = a;
	int v1 = v;
	
	if(p < 32 && (v == 0 || v == 1))
	{
		if(v == 0)
		{
			for(i = 1;i <= 32;i  )
			{
				if(i != 33 - p)//第p位为0,其余为1
				{
					v = v << 1;
					v = v ^ 1;
				}
				else
				{
					v = v << 1;
				}
			}
			a = a & v;
		}
		else
		{
			for(i = 0;i < p - 1;i  )//第p位为1,其余为0
			{
				v = v << 1;
				//printf("%d  ",v);
			}
			a = a | v;
			//printf("n");
		}
	}
	else
	{
		printf("error input");
	}
	outChange(a);
	return 0;
}

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

代码语言:javascript复制
#include<stdio.h>
void outChange(int n)
{
	if(n == 0)
	{
		return;
	}
	else
	{
		outChange(n >> 1 );
		printf("%d",n & 1);
	}
}

int main()
{
	int a,b;
	int i,j;
	int b_bit;
	printf("please input integer:");
	scanf("%d", &a);
    int a_back;
	int a_left,a_right;
	
	for(i = 0;i < 32;i  )//计算左右异或结果
	{
		a_back = a;		
		if(i == 31)//取最低位的左右位
		{
			a_right = 0;
			a_left = (a_back >> 1) & 1;
		}
	    else
		{
			for(j = 0;j < 30 - i;j  )//从第32位依次向前
			{
				a_back = a_back >> 1;
			}	
			a_left = a_right = a_back;
			a_right = a_right & 1;
			a_left = a_left >> 2;
			a_left = a_left & 1;
		}
//		printf("第%d位左边为%d,右边为%dn",32-i,a_left,a_right);

		b = b << 1;
		b_bit = a_left ^ a_right;
		b = b | b_bit;
	}
	printf("异或生成的b为:");
	outChange(b);
	return 0;
}

0 人点赞