目录
一、方案一
1.求待操作数的二进制序列
2.创建一个数组存放待操作数的二进制序列
3.交换二进制序列奇偶位
4.输出奇偶位交换之后的二进制序列
5.代码
二、方案二(宏的实现)
1.求待操作数二进制序列偶数位
2.求待操作数二进制序列奇数位
3.求待操作数交换奇偶位的二进制序列
4.代码
一、方案一
1.求待操作数的二进制序列
一个整数按位与1可以求得二进制序列的最低位,利用左移操作符每按位与一次左移一位,这样循环32次之后就可得到完整的二进制序列。
2.创建一个数组存放待操作数的二进制序列
从数组的最后一个元素arr[31]开始存放,依次递减。即二进制序列最高位放在数组的最左边,最低位放在最右边。和实际的二进制序列顺序保持一致。
3.交换二进制序列奇偶位
把数组中的元素arr[0]和arr[1]进行交换,执行结束向后走两步交换arr[2]和arr[3],以此类推没交换一次先后走两步重复操作,直到交换完做后一个元素arr[31]。
4.输出奇偶位交换之后的二进制序列
实质上是输出交换顺序后的数组
5.代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void swap_b(int x)
{
int i = 0;
int arr[32] = { 0 };
for (i = 31; i >= 0; i--)
{
if ((x & 1) == 0)
{
arr[i] = 0;
}
else
{
arr[i] = 1;
}
x = x >> 1;
}
printf("二进制位序列:\n");
for (i = 0; i < 32; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
for (i = 0; i < 32; i += 2)
{
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
}
printf("交换奇偶位的二进制位序列:\n");
for (i = 0; i < 32; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int a = 0;
scanf("%d", &a);
swap_b(a);
return 0;
}
总结:该方案只能输出待操作数二进制序列交换奇偶位后的二进制序列,并不会改变待操作数本身
二、方案二(宏的实现)
1.求待操作数二进制序列偶数位
将待操作数与一个二进制序列的偶数位全为1,奇数位全为0的数(0x AA AA AA AA)执行按位与操作,可得到待操作数的偶数位
2.求待操作数二进制序列奇数位
将待操作数与一个二进制序列的奇数位全为1,偶数位全为0的数(0x 55 55 55 55)执行按位与操作,可得到待操作数的奇数位
3.求待操作数交换奇偶位的二进制序列
将求得的已知偶数位且奇数位全为0的二进制序列左移一位与已知奇数位并且偶数位全为0的二进制序列右移一位,然后将分别左移、右移后的二进制序列相加即可得到待操作数交换奇偶位的二进制序列
4.代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define SWAP_B(x) (x)=((((x)&(0xAAAAAAAA))>>1)+(((x)&(0x55555555))<<1))
int main()
{
int a = 0;
scanf("%d", &a);
int i = 0;
for (i = 31; i >= 0; i--)
{
if (((a >> i) & 1) == 1)
{
printf("%d ", 1);
}
else
{
printf("%d ", 0);
}
}
printf("\n");
SWAP_B(a);
printf("%d\n", a);
for (i = 31; i >= 0; i--)
{
if (((a >> i) & 1) == 1)
{
printf("%d ", 1);
}
else
{
printf("%d ", 0);
}
}
printf("\n");
return 0;
}
总结:该方案是直接对待操作数进行操作,会改变待操作数的值。宏的实现既可以得到交换奇偶位后的二进制序列,也可以得到该二进制序列所对应的数。