如何交换一个数两位

dlutwy 2008-07-16 08:59:17
比如一个int有32位,现在我想交换其中的第i和j位,得到一个新的数。
希望给出尽可能高效和简单的办法。
...全文
506 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlutwy 2008-07-18
  • 打赏
  • 举报
回复
刚才我理解错了,算法是从0位开始的,谢谢大家,可以结贴了。
dlutwy 2008-07-18
  • 打赏
  • 举报
回复
思路是对的,但具体细节貌似错了,我的测试是:
交换1253的1、2两位

10011100101
10011100011
交换后最后两位都是1了,貌似是错的。
dlutwy 2008-07-18
  • 打赏
  • 举报
回复
这样还要你说,我说了要位运算,要求效率。
冰思雨 2008-07-17
  • 打赏
  • 举报
回复
难道我的算法有错误么? 我没有测试的.但,应该是速度很快的.
private static int dig [] = new int[]{1,2,4,8,0x10,0x20,0x40,0x80,
0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000,
0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000,
0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x40000000,0x80000000};
public static int swapIntDigital(int num,int i,int j){
if(i!=j){
int ti=num&dig[i];
int tj=num&dig[j];
num=ti>0?num|dig[j]:num&~dig[j];
num=tj>0?num|dig[i]:num&~dig[i];;
}
return num;
}
xunyiren 2008-07-17
  • 打赏
  • 举报
回复
参照我们同事的代码,写了个既可从低位算起, 也可从高位算起的算法

所谓的从高位算起,比如123456789的二进制数为实为00000111010110111100110100010101,要从第一个有效位1算起,即不包括前导0(111010110111100110100010101),这样交换5,6位后转变为
111011010111100110100010101

public class Test04 {
/**
* @param position 0从低位算起, 1从高位算起(不包括前导0,即实际有效位), 索引从0开始算起
* @param n 要交换位置的整数
* @param i 位置i
* @param j 位置j
* @return
*/
public static int bitMove(int position, int n, int i, int j) {
if (i < 0 || i > 31 || j < 0 || j > 31 || i == j) return n;
if (position == 0) {
return ((n >> i & 1) << j) | ((n >> j & 1) << i) | (n & (-1 ^ ((1 << i) | (1 << j))));
} else if (position == 1) {
int offsetNum = 0;
if (n>0) {
while ((n << ++offsetNum) > 0) {
}
}
i+=offsetNum;
j+=offsetNum;
System.out.println("i=" + i + ", j=" + j);
return ((n >> 31-i & 1) << 31-j) | ((n >> 31-j & 1) << 31-i) | (n & (-1 ^ ((1 << 31-i) | (1 << 31-j))));
}
return n;
}

public static void main(String[] args) {
int a = -9633214;
int b = 123456789;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
System.out.println(Integer.toBinaryString(bitMove(0, a,8,9)));
System.out.println(Integer.toBinaryString(bitMove(1, a,8,9)));
System.out.println(Integer.toBinaryString(bitMove(0, b,2,1)));
System.out.println(Integer.toBinaryString(bitMove(1, b,5,6)));
}
}
xunyiren 2008-07-17
  • 打赏
  • 举报
回复

public class Test04 {
public static int bitMove(int n, int i, int j) {

return ((n >> i & 1) << j) | ((n >> j & 1) << i) | (n & (-1 ^ ((1 << i) | (1 << j))));
}

public static void main(String[] args) {
int a = 85;
int b = 123456789;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
System.out.println(Integer.toBinaryString(bitMove(a,2,1)));
System.out.println(Integer.toBinaryString(bitMove(b,1,0)));
}
}
xunyiren 2008-07-17
  • 打赏
  • 举报
回复
public class Test04 {
public static int bitMove(int n, int i, int j) {

return ((n >> i & 1) << j) | ((n >> j & 1) << i) | (n & (-1 ^ ((1 << i) | (1 << j))));
}

public static void main(String[] args) {
int a = 85;
int b = 123456789;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(b));
System.out.println(Integer.toBinaryString(bitMove(a,2,1)));
System.out.println(Integer.toBinaryString(bitMove(b,1,0)));
}
}
BatiTan 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 chenniaoc 的回复:]
用字符串显然不高效
期待牛人
[/Quote]利用位运算~
hmsuccess 2008-07-16
  • 打赏
  • 举报
回复


public class SwapBit {

/**
* @param args
* author hanmeng 2008-7-16
*/
public static void main(String[] args) {
int m = -9633214;
int n = swap(m, 22, 1);
System.out.println(Integer.toBinaryString(m));
System.out.println(Integer.toBinaryString(n));
}

public static int swap(int num, int i, int j) {
int a = (num >> i) & 1;
int b = (num >> j) & 1;
System.out.println("a="+a+" "+"b="+b);
int flag = a^b;
if(flag==1)
{
num ^= 1<<i;
num ^= 1<<j;
}
return num;
}
}
bailu35015192 2008-07-16
  • 打赏
  • 举报
回复

public class AA {
public static void main(String[] args) {


int num = 1234567890;
StringBuilder sb = new StringBuilder(num + "");
char ch3 = sb.charAt(2);
char ch5 = sb.charAt(4);
sb.replace(2, 3, ch5 + "");
sb.replace(4, 5, ch3 + "");
int ret = Integer.parseInt(sb.toString());
System.out.println(ret);

}
}
这个方法不错,但是你认为int类型的能有32位数吗?
zhj92lxs 2008-07-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lovingprince 的回复:]
不错有好算法啊,呵呵。
[/Quote]
amdwinter 2008-07-16
  • 打赏
  • 举报
回复
I,J
I=I+J;
J=I-J;
I=I-J;
chenniaoc 2008-07-16
  • 打赏
  • 举报
回复
用字符串显然不高效
期待牛人
bananabear 2008-07-16
  • 打赏
  • 举报
回复
充分利用|和&操作符,相信就会解决了。。。
fenseyouyu 2008-07-16
  • 打赏
  • 举报
回复

public class ReplaNum {

public static void main(String[] args) {
ReplaNum re = new ReplaNum();
System.out.println(re.Replacement(123316711,1,6)); //1,6表示第1位与第6为交换

}
//int i,int j 为交换的参数
public int Replacement(Integer num,int i,int j){

String charnum = num.toString();//把num转变成字符串。
int temp = 0; //空桶
int [] arr = new int [charnum.length()];
if(i>charnum.length()||j>charnum.length()){
System.out.println("超出范围");
return 0;
}
i=i-1;
j=j-1;
if(i<0||j<0){
System.out.println("交换参数不能小与0");
return 0;

}
for(int z = 0;z<charnum.length();z++){ //把num拆分并存放数组中
arr[z] =Integer.valueOf(charnum.substring(z,z+1));
}
temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
//arr to String
charnum="";
for(int z = 0;z<arr.length;z++ ){

charnum+=arr[z];
}


return Integer.valueOf(charnum);
}

}



匆忙之中写的。有不对的地方希望大家改正。能用就给分了。。
LexChen 2008-07-16
  • 打赏
  • 举报
回复
Look!


/** i ,j 从0开始计算
* @param value 要交换得值
* @param i 第i位
* @param j 第j位
* @return 交换i,j位后得整数值
*/
public int swap(int value,int i,int j){
if(i<j){
i = i + j;
j = i - j;
i = i - j;
}
int mask_i = value & (1<<i);
int mask_j = value & (1<<j);
value = (value | (mask_i>>i-j)) & ((mask_i>>i-j)|(0xffff^mask_j));
value = (value | (mask_j<<i-j)) & ((mask_j<<i-j)|(0xffff^mask_i));
return value;
}
bootupnow 2008-07-16
  • 打赏
  • 举报
回复
此帖收藏备用,棒!
hmsuccess 2008-07-16
  • 打赏
  • 举报
回复
直接移位
qingting2016 2008-07-16
  • 打赏
  • 举报
回复
转字符串,查找替换
lisl2003 2008-07-16
  • 打赏
  • 举报
回复
每天进步一点点。
加载更多回复(24)

62,610

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧