问题描述如下:
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)。
代码如下:
1void 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}
是否有一种高效的算法,只是进行一,两步位与或运算即可。。