在Java中使用`Integer.tobinarysting()`时处理填充

在Java中使用`Integer.tobinarysting()`时处理填充,java,arrays,algorithm,binary-operators,Java,Arrays,Algorithm,Binary Operators,我想为这个问题实现Method2,但我有一个问题。我不知道如何将数组中的数字分成两组(在二进制表示中指定位置有“1”的数字和没有“1”的数字),我认为我必须使用Integer.tobinarysting()对数组中的每个数字使用以下方法: private static boolean hasOne(int number, int i) { String s = Integer.toBinaryString(number); if(s.charAt(i) == '1')

我想为这个问题实现Method2,但我有一个问题。我不知道如何将数组中的数字分成两组(在二进制表示中指定位置有“1”的数字和没有“1”的数字),我认为我必须使用
Integer.tobinarysting()
对数组中的每个数字使用以下方法:

private static boolean hasOne(int number, int i) {
    String s = Integer.toBinaryString(number);
    if(s.charAt(i) == '1')
        return true;
    return false;
}

但问题是并非每个数字在二进制表示中都有相同的长度,而且该方法不能正确工作。我该怎么办?例如,我如何处理填充物?

它实际上非常接近您所拥有的。假设您正在检查位置
6
处的二进制值。那将是

0101011
------^
最简单的方法是,在检查值是否为
1
0
之前,只需检查二进制字符串的
大小是否大于索引

if(s.length() <= i) {
    return false;
}

if(s.length()由于您在执行显式转换为二进制并在其中查找设置位的额外步骤时遇到困难,只需知道提供的代码端口仅用于java,因为它主要是按位操作:

public static void main (String[] args)
{
    int arr[] = {2, 3, 7, 9, 11, 2, 3, 11};
    int xor = 0;
    for (int i = 0; i < arr.length; i++) {
        xor ^= arr[i];
    }
    int set_bit_no = xor & ~(xor-1);
    int x = 0, y = 0;
    for (int i = 0; i < arr.length; i++) {
        if ((arr[i] & set_bit_no) != 0) {
            x ^= arr[i];
        } else {
            y ^= arr[i];
        }
    }
    System.out.println(x); // prints 7
    System.out.println(y); // prints 9
}
publicstaticvoidmain(字符串[]args)
{
int arr[]={2,3,7,9,11,2,3,11};
int-xor=0;
对于(int i=0;i
首先,您可以使用
字符串的组合填充二进制字符串。format
replace

String s = String.format("%32s", Integer.toBinaryString(number)).replace(' ', '0');
您还可以使用位运算符来确定给定数字的二进制表示在某个位置是否有1

例如,考虑十进制数<代码> x=20 < /代码>,即二进制中的“代码>10100”/CODE。此外,假设您想确定二进制数是否从右“代码> n=3 < /代码>的第三个点中有1个。您可以使用位移<代码> > /代码>将二进制序列移到右边两次<代码> N-1 < /COD>然后用1屏蔽它

结果表达式看起来像
(20>>2)&1
,如果右侧第三个点中确实有1,则计算结果为1,如果没有,则计算结果为0。在这种情况下,计算结果为1

因此,您可以进一步将其概括为:

private static boolean hasOne(int number, int i) {
    return ((number >> (i - 1)) & 1) == 1;
}

您可以在中了解有关按位和位移位运算符的更多信息。

其中大部分可以轻松移植到Java。如果您试图从右侧而不是左侧获取第n个数字,则第二个for循环中几乎没有任何内容需要更改(除了指针内容)@user3371223。您可以使用s.charAt(s.length-(i+1));且任何i>=s.长度为false@Ben这是在java中,我不知道C++。我的问题是如何把数字分成两组(在指定位置有‘1’的部分,其余部分)。因为我使用上述方法的想法无法正常工作。java可以进行逐位操作。在他们的示例中,您需要表示xor中设置的任何位的数字,
set\u bit\u no
,然后按位和每个数字一起查看该数字是否设置了该位。这是您的分区。