前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >位运算训练

位运算训练

作者头像
Gabriel
发布2022-11-15 13:56:01
2730
发布2022-11-15 13:56:01
举报
文章被收录于专栏:C/C++

一,请编写一个 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("%d\n", 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,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位取反后输出

代码语言: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 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, 输出修改后的该整数的二进制表示

代码语言: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,右边为%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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档