Java 合并字符数组的顺序正相反

Java 合并字符数组的顺序正相反,java,bit-manipulation,Java,Bit Manipulation,我已经写了一个简单的程序来滑动位在一个像73这样的整数中的位置。当我将数组转换回字符串时,位的顺序似乎颠倒了。我应该得到11分,我的答案是104分。不知道我做错了什么 public class P5_2 { public static int myswap(int x, int i, int j) { String xStr = Integer.toBinaryString(x); char[] arr = xStr.toCharArray(); System.ou

我已经写了一个简单的程序来滑动位在一个像73这样的整数中的位置。当我将数组转换回字符串时,位的顺序似乎颠倒了。我应该得到11分,我的答案是104分。不知道我做错了什么

public class P5_2 {


public static int myswap(int x, int i, int j)
{
    String xStr = Integer.toBinaryString(x);
    char[] arr = xStr.toCharArray();

    System.out.println(arr);

    char temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;


    xStr = new String(arr);

    //it seems it is joining the char array from LSB to MSB side, hence flipping !! why

    System.out.println(xStr);

    x = Integer.parseInt(xStr, 2);

    return x;


}

public static void main(String[] args)
{

    int x = 73;
    int n;
    int i = 6;
    int j = 1;

    n = myswap(x, i, j);


    System.out.print(n);
}
}

这里的ParseInt有点棘手。请参阅以下内容-


这里的ParseInt有点棘手。请参阅以下内容-


请记住,数组是基于零的。当您要求
swap
将数字73中的第6位与第1位进行翻转时,实际上是让swap翻转第2位和第7位

要解决此问题,只需使用swap方法将i和j减去1,它将按预期工作:

public static int myswap(int x, int i, int j)
{
    i = i - 1;
    j = j - 1;

    // rest of code...
}

请记住,数组是基于零的。当您要求
swap
将数字73中的第6位与第1位进行翻转时,实际上是让swap翻转第2位和第7位

要解决此问题,只需使用swap方法将i和j减去1,它将按预期工作:

public static int myswap(int x, int i, int j)
{
    i = i - 1;
    j = j - 1;

    // rest of code...
}

通常二进制数表示中的位是从右向左编号的,顺序是从最低有效到最高有效

例如,二进制中的数字73:

binary digits: 1 0 0 1 0 0 1
bit number:    6 5 4 3 2 1 0
但是,当您转换为二进制字符串(如with
toBinaryString()
)时,将首先输出最高有效位,因为字符串中的数字是从左到右存储的。例如字符串“10001001”:

要交换原始数字的第1位和第6位,需要交换char数组的元素5和0。这将为您提供解析为11的字符串“0001011”。交换元素1和6将得到字符串“1101000”,即104

因此,您只需要根据字符串的长度颠倒索引的顺序:

String xStr = Integer.toBinaryString(x);
i = (xStr.length() - 1) - i;
j = (xStr.length() - 1) - j;
或者,如果您根本不想使用字符串,可以使用以下方法交换位:

publicstaticintmyswap(intx,inti,intj)
{
//如果位不同(异或),则b为1,否则为0
intb=((x>>i)^(x>>j))&1;
//如果不同,请翻转位

返回x^((b通常二进制数表示中的位是从右到左编号的,顺序是从最低有效到最高有效

例如,二进制中的数字73:

binary digits: 1 0 0 1 0 0 1
bit number:    6 5 4 3 2 1 0
但是,当您转换为二进制字符串(如with
toBinaryString()
)时,最重要的数字首先输出,因为字符串中的数字是从左到右存储的。例如字符串“10001001”:

要交换原始数字的第1位和第6位,需要交换字符数组的元素5和0。这将为您提供解析为11的字符串“0001011”。交换元素1和6将为您提供字符串“1101000”,即104

因此,您只需要根据字符串的长度颠倒索引的顺序:

String xStr = Integer.toBinaryString(x);
i = (xStr.length() - 1) - i;
j = (xStr.length() - 1) - j;
或者,如果您根本不想使用字符串,可以使用以下方法交换位:

publicstaticintmyswap(intx,inti,intj)
{
//如果位不同(异或),则b为1,否则为0
intb=((x>>i)^(x>>j))&1;
//如果不同,请翻转位

返回x^((b)试图反转整个二进制位?char temp=arr[i];arr[i]=arr[j];arr[j]=temp;这段代码的意思是什么。为什么只将第i个索引与第j个索引交换?您所说的“在整数中滑动位位置”是什么意思?正在尝试反转整个二进制位吗?char temp=arr[i];arr[i]=arr[j];arr[j]=temp;这段代码的意思是什么。为什么只将第i个索引与第j个索引交换?您所说的“在整数中滑动位位置”是什么意思?这段代码不正确。您只是转换字符串“11”此代码不正确。您只是将字符串“11”转换为整数。