32位整数的二进制表示

时间:2015-03-25 12:39:55

标签: java

我编写了一个非常简单的算法来生成32位整数的二进制表示。

这是我的代码:

public class NumberManipulator {

public static final int HEAVIEST_BIT = 32;


public static long intPower(int value, int power) {
    if (0== power) {
        return 1;
    }

    long result = 1;
    for (int i = 1; i <= power; i++) {
        result = result * value;
    }
    return result;
}


public static void main(String[] args) {

    int n1 = 7;
    int n2 = 18;
    int n3 = 65;
    int n4 = 11;

    System.out.println(getBinaryRepresentationOf(n1));
    System.out.println(getBinaryRepresentationOf(n2));
    System.out.println(getBinaryRepresentationOf(n3));
    System.out.println(getBinaryRepresentationOf(n4));

}

public static String getBinaryRepresentationOf(int number) {
    StringBuilder resultBuilder = new StringBuilder();

    for (int i =  HEAVIEST_BIT-1;  i >= 0; i--) {

        long checker = (number >> i) & 1; // (number & intPower(2,i));    (number >> i) & 1; 
        if (checker == 1 ) {
            resultBuilder.append("1");
        } else {
            resultBuilder.append("0");
        }
    }
    return resultBuilder.toString();
}

此代码工作正常。下图说明了对main方法结果的调用。

Binary representation of 32 bits numbers

但是当我将long checker = (number >> i) & 1更改为(number & intPower(2,i))时,我遇到了一个问题,它只是给了我异常的结果,我真的无法弄清楚原因。对此非常欢迎。

1 个答案:

答案 0 :(得分:2)

想象一下number是2.在二进制文件中0010并且您正在与intPower(2, 1)进行比较。你正在做的是2 & 20010 & 0010),结果又是20010)。你的if会因为与1比较而失败。简而言之,&之后的0 rhs 值(与1类似,并不总是0 / (number >> i) & 1)。

将您的代码更改为:

if (checker != 0) {
    resultBuilder.append("1");
} else {
    resultBuilder.append("0");
}