問題描述如下:
2個整數(int32),我需要對這2個數的第n位進行二進制數交換值。是否有一個高效的算法,或者高效的運算。
例子如下:
2個整數10,7,把第1位的數值交換。
整數 二進制 交換后二進制 交換后的值
10 0x1010 0x1011 11
7 0x0111 0x0110 6
我的思路如下:
1.如果要對第n位數值交換,先求出第n位的值(1或者0),如果相等則不交換。
2.交換第n位,通過通過原理發現只需通過加減法運算即可,如果1->0 則減 1<<(n-1) ,否則加1<<(n-1)。
代碼如下:
1
void prjfun( int & des , int & src , int n)
2

{
3
if( n <= 0 ) return ;
4
5
int x = (des & (1<<(n-1))) >>(n-1); // 求出第n位的數值
6
int y = (src & (1<<(n-1))) >>(n-1); // 求出第n位的數值
7
if ( x != y )
8
{
9
des += (y-x)*(1<<(n-1)); // 交換
10
stc += (x-y)*(1<<(n-1)); // 交換
11
}
12
}
是否有一種高效的算法,只是進行一,兩步位與或運算即可。。