1.首先要单独取出奇数位和偶数位的数字
这里我们使用两个16 进制的一对数字:0x55555555和0xaaaaaaaa
2.把我们要求得整数转换成二进制按位与0x55555555与得出奇数位的数字向左移一位就到了偶数位(这里我们假设为),同理得出偶数位的数字右移一位:
由此:由0111->1011;1011转换成10进制为11
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define CHANGE(N) (((N&0x55555555)<<1)|(N&0xaaaaaaaa)>>1))
int main() {
int n = 7;
printf("%d\n", CHANGE(7);
}
运行如下: