C语言位操作--不用中间变量交换两数值

时间:2023-03-09 05:09:17
C语言位操作--不用中间变量交换两数值

1、使用加法与减法交换两数值:

 #define SWAP(a, b) ((&(a) == &(b)) || \
(((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))

这种交换数值a与b的方法没有使用临时变量,初始化检测a,b,如果在同一内存区,则被忽略,当然这通常不会发生,(编译器会忽略,然而无论如何都是一种优化),假如可以确

定溢出异常,于是传递无符号数异常就不会抛出。

下面的逻辑“或”运算的方法在某些机器上可能要快一些,不要使用浮点型数字。

2、使用逻辑“或”方法交换两数值:

 #define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))

3、使用逻辑“或”方法交换独立位:

 unsigned int i, j;
unsigned int n;
unsigned int b;
unsigned int r; unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - ); // XOR temporary
r = b ^ ((x << i) | (x << j));

其中:b为目标数字,以二进制的形式表示,从最右边比特位开始计算,标号为0,i指向第i+1个比特位,

n指连续比特位的个数,j指向第j+1个比特位,r保存交换后的值。

e.g. b = 00101111   n=3,i=1,j=5

r = 11100011

C测试代码如下:

#include <stdio.h>
#include <string.h> void tranlate(int n) //十进制转换为二进制
{
int a[];
int i,L,j;
i=L=;
while(n/){
a[i]=n%;
n/=;
L++,i++;
}
a[i]=;
while(L<){ //设置为显示8位的二进制
a[++i]=;
L++;
}
for(j=L-; j>=; j--){
printf("%d",a[j]);
}
printf("\n");
} int main(int argc, char *argv[])
{
unsigned int i, j;
unsigned int n;
unsigned int b;
unsigned int r;
b=,n=,i=,j=;
tranlate(b);
unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - );
r = b ^ ((x << i) | (x << j));
tranlate(r);
getchar();
getchar();
return ;
}