位运算训练

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

#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("%d\n", fun(c));
	
	return 0;
}

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

#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,p2\n");
	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位取反后输出

#include <stdio.h>
int main()
{	
    int a;
	int p1,p2;
	int i;
	printf("please input:");
	scanf("%d",&a);
	printf("please inpt p1,p2 to negation\n");
	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, 输出修改后的该整数的二进制表示

#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 位的异或结果

#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,右边为%d\n",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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gabriel.Tian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值