从int bit base 2值获取int数组值

时间:2017-02-22 09:58:39

标签: java

我有点像下面的位置

Bit 0(2^0 .= 1) - 1
Bit 1(2^1 .= 2) - 2
Bit 2(2^2 .= 4) - 4
Bit 3(2^3 .= 8) - 8
Bit 4(2^4 .= 16) - 16

7表示我们有1+2+4。但是我如何以编程方式获得这个数组?

4 个答案:

答案 0 :(得分:1)

连续除以2并保存余数

int n = 7;
StringBuilder sb  = new StringBuilder();
while(n>0) {
    sb.append(n%2);
    n = n/2;
}
System.out.println(sb.reverse().toString());

您可以随意存储它。目前它存储为字符串(二进制表示为7)。

要从字符串转换回二进制,从LSB开始,如果位值为1,则按位位置2的幂加上

答案 1 :(得分:1)

简单的逻辑,适用于intmax(只需更改类型即可轻松更改为最大值))

public static void main(String[] args) {
    int originalInt = 127;
    toIntegerArray(originalInt);
}

private static List<Integer> toIntegerArray(int originalInt) {
    String bits = Integer.toBinaryString(originalInt);

    // Reversed, for easier logic when building string
    StringBuilder s = new StringBuilder(bits).reverse();

    char[] bitArray = s.toString().toCharArray();

    List<Integer> result = new ArrayList<>();
    for (int i = 0; i < bitArray.length; i++) {
        if (bitArray[i] == '1') {
            result.add((int) Math.pow(2, i));
        }
    }

    System.out.println("Original int: " + originalInt);
    System.out.println("Bit pattern: " + bits);
    System.out.println(result);

    return result;
}

答案 2 :(得分:0)

我得到了以下工作,但是对于低于31的值。有关如何允许任何值的任何建议吗?

    public static void Main(string[] args)
    {
        Console.WriteLine();
        Console.WriteLine("[{0}]", string.Join(", ", log3(100)));   
    }

    static int[] log3(int x) {
        List<int> pow = new List<int>();

        int val=x;

        do{
           if(x>= 1 << val){
                if(1<<val>0){
                    pow.Add(1<<val);
                }
                x-=1<<val;
            }
            val-=1;
        }while(val>=0);

        return pow.ToArray();
    }

答案 3 :(得分:0)

这是一个递归流选项:

{{1}}