2013-09-30 125 views
0

我们有一个随机数和随机数的数组,例如。按二进制数组选择数组

[12, 2345, 232, 52, 24]. 

而我们只想选择那些由二进制数字定义的例如。

5= 101 = [0, 0, 1, 0, 1] 

所以阵列X,我想是

[0, 0, 232, 0, 24]; 

int[] x = {12, 2345, 232, 52, 24}; 
int b = 5; 
int[] X = eliminate(x, b); 

// 
x = [12, 2345, 232, 52, 24] 
b = [ 0, 0, 1, 0, 1] 
X = [ 0, 0, 232, 0, 24] 

任何快速的方法来做到这一点?

感谢

+2

顺便说一句,3不是'101'但'11','101'将5 – Thomas

+0

@Thomas我纠正说,它似乎是一个错字。 –

+0

@Mazmart我不确定你是否需要int - > bitarray转换,所以我在我的答案中加入了一个。 –

回答

3

使用BitSet也许会有帮助,为intBitSet之间的转换看看这里:BitSet to and from integer/long

下面是使用来自链接Bits类快速劈:

public static int[] eliminate(int[] x, int b) { 
    BitSet bs = Bits.convert(b); 
    int[] X = new int[x.length]; 

    for(int i = 0; i < x.length; i++){ 
    if(bs.get(x.length - (i + 1))){ 
     X[i] = x[i]; 
    } 
    else { 
     X[i] = 0; 
    } 
    } 

    return X; 
} 

结果将是:

x = [12, 2345, 232, 52, 24] 
b = 5 (i.e. 101 binary) 
X = [0, 0, 232, 0, 24] 

请注意,如果您想直接定义位,则可以将其设置在BitSet中。

1

只是一个for循环

int[] newarray = new int[length]; 
for(int i = 0; i < length; i++) 
{ 
    if(b[i]==1) 
     newarray[i] = x[i]; 
    else 
     newarray[i] = 0; 
} 

只要确保长度到处是一致的。

0

由于这样的:

int i = 3; 
int[] yourArray; 
for (int i = 0; i < yourArray.length; i++) { 
    yourArray[i] = yourArray[i] & i == i ? yourArray[i] : 0; 
} 
+0

由于yourArray未初始化,因此此代码将始终失败。 –

0

试试这个:

String binSt = Integer.toBinaryString(5); // has no leading 0s 
    byte[] x = {12, 21, 21, 52, 24}; 
    byte[] xResult = new byte[x.length]; 
    int offset = x.length - binSt.length(); // to simulate leading 0s 
    for (int i = 0; i < xResult.length; i++) { 
     xResult[i] = (i-offset < binSt.length() && i-offset >= 0 && binSt.charAt(i-offset) == '1' ? x[i] : 0); 
    } 
    System.out.println(Arrays.toString(xResult));