-1

嗨,我正在创建一种方法,该方法将获取一个数字并将其与二进制表示一起打印。问题是我的方法为任何正数打印全 0,为任何负数打印全 1

private static void display( int number ){

        System.out.print(number + "\t");        
        int mask = 1 << 31;

        for(int i=1; i<=32; i++) {
            if( (mask & number) != 0 )
                System.out.print(1);
            else
                System.out.print(0);


            if( (i % 4) == 0 )
                System.out.print(" ");

        }

    }

我明白了:这有效:

/**
     * prints the 32-bit binary representation of a number
     * @param number the number to print
     */
    private static void display( int number ){
        //display number and a tab
        System.out.print(number + "\t");

        //shift number 31 bits left
        int mask = 1 << 31;

        //loop and print either 1 or 0
        for(int i=31; i>=0; i--) {
            if( ((1 << i)&number) != 0)
                System.out.print(1);
            else
                System.out.print(0);

            //every four bits print a space
            if( (i % 4) == 0 )
                System.out.print(" ");            

        }
        //print new line
        System.out.println();
    }
4

2 回答 2

5

您忘记更新掩码:

    for(int i=1; i<=32; i++) {
        if( (mask & number) != 0 )
            System.out.print(1);
        else
            System.out.print(0);


        if( (i % 4) == 0 )
            System.out.print(" ");

        mask = mask >> 1;
    }
于 2010-05-06T20:13:25.123 回答
2

该问题的文本已被多次编辑,因此很难说出问题是什么,但这里有一些说明。

在有符号与无符号移位

该问题的一个修订版包含以下行:

int mask = 1 << 31;

一个答案表明缺少的是这一行:

mask = mask >> 1;

这实际上是行不通的,因为这是一个有符号移位,并且会为此目的>>导致不正确的值(因为空位用s 填充)。任何负数都将转换为 32 位,所有.mask11

需要的是无符号右移。

mask >>>= 1;

请注意,为简洁起见,使用了复合赋值。无符号右移>>>用 填充空位0。如此处所使用的,它确保mask始终只设置一个位,这是此问题所需要的。

也可以看看

类似的问题


替代解决方案

实际上有一个更简单的解决方案将 32 位int转换为 32 位,分成 4 位组。

static String zeroes(int length) {
    return (length <= 0) ? ""
      : String.format("%0" + length + "d", 0);
}
//...

int num = 8675309;

// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"

// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"

s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"

即使这是家庭作业,这里使用的各种技术仍然应该是指导性的。

也可以看看

于 2010-05-07T03:17:59.237 回答