交换一个整数二进制位的奇数位和偶数位

目录

方法一:采用数组

方法二:宏定义


方法一: 

知识点:&(按位与)以及 <<(左移),>> (右移) 操作符的使用

知识点回顾:

&(按位与)全一则一           |(按位或)有一则一

^(按位异或)相同为0,相异为1          ~(按位取反)1变0,0变1

<<(左移操作符):左边舍弃,右边补0

>>(右移操作符):右边舍弃,左边补符号位

思路:1.构建数组并取出二进制位 

           2.相邻奇偶位交换

取出二进制位:

以此类推,取出二进制位就是((x(目标数)>>1) &1)

相邻奇偶位交换

总代码;

#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	int arr[32] = { 0 };
	int i = 0;
	for (i = 31; i >= 0; i--)
	{
		if ((a & 1) == 1)
		{
			arr[i] = 1;
		}
		else
		{
			arr[i] = 0;
		}
		a =a >> 1;
	}
	printf("二进制位序列:\n");
	for (i = 0; i < 32; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	for (i = 0; i < 32; i+=2)
	{
		int temp = arr[i];
		arr[i] = arr[i+1];
		arr[i + 1] = temp;
	}
	for (i = 0; i < 32; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

方法二: 

思路:

 

代码:

#include <stdio.h>
#define swap(x) ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1)
int main()
{
	int a;
	scanf("%d", &a);
	int i = 0;
	for (i = 31; i >=0 ; i--)
	{
		printf("%d ", (a >> i) & 1);
	}
	printf("\n");
	printf("交换后结果\n");
	a = swap(a);
	for (i = 31; i >= 0; i--)
	{
		printf("%d ", (a >> i) & 1);
	}
	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值