在Java中以二进制格式打印整数


277

我有一个数字,我想以二进制形式打印。我不想通过编写算法来做到这一点,Java中是否有内置函数?

Answers:


434

假设您的意思是“内置”:

int x = 100;
System.out.println(Integer.toBinaryString(x));

请参阅整数文档

Long具有类似的方法,BigInteger具有可在其中指定基数的实例方法。)


2
这样就排除了领先的
0'

1
@AbuRuqaiyah:行动党从未提及过零,我们需要知道他们对一件事有多大的期望……
乔恩·斯基特

@AbuRuqaiyah如果您想要前导零,则可以使用System.out.printf()进行大量控制。
NomadMaker

246

这里不需要仅依赖于二进制或任何其他格式...有一个灵活的内置函数可用,它可以在您的程序中打印所需的任何格式。

Integer.toString(100,8) // prints 144 --octal representation

Integer.toString(100,2) // prints 1100100 --binary representation

Integer.toString(100,16) //prints 64 --Hex representation

用不同的数字(负,正,大,小)对其进行测试
Tertium

8
toBinaryString使用二进制补码输出,toString将数字指定的底数隐蔽,并在前面加上负号,因此toString(-8, 2) == "-1000"
Joe


21

我需要一些东西来很好地打印出来,然后将每个n位分开。换句话说,显示前导零并显示如下内容:

n = 5463
output = 0000 0000 0000 0000 0001 0101 0101 0111

所以这是我写的:

/**
 * Converts an integer to a 32-bit binary string
 * @param number
 *      The number to convert
 * @param groupSize
 *      The number of bits in a group
 * @return
 *      The 32-bit long bit string
 */
public static String intToString(int number, int groupSize) {
    StringBuilder result = new StringBuilder();

    for(int i = 31; i >= 0 ; i--) {
        int mask = 1 << i;
        result.append((number & mask) != 0 ? "1" : "0");

        if (i % groupSize == 0)
            result.append(" ");
    }
    result.replace(result.length() - 1, result.length(), "");

    return result.toString();
}

像这样调用它:

public static void main(String[] args) {
    System.out.println(intToString(5463, 4));
}

为什么result.replace(result.length() - 1, result.length(), "");需要?当我们通过时int,它已经是32位的。我们要在倒数第二行替换什么?
Parth 2015年

1
@Parth在每个步骤中,我们都会在字符串的末尾添加一个空格字符(“”)。您提到的行将摆脱最后一个附加的空格字符。本质上,您可以调用String类的trim函数来达到相同的效果。
Maghoumi 2015年

您可以通过添加0x100000000的数目,将其转换为长,然后丢弃领先1.做了很多更简单,高效地
洛恩侯爵

7

老套:

    int value = 28;
    for(int i = 1, j = 0; i < 256; i = i << 1, j++)
        System.out.println(j + " " + ((value & i) > 0 ? 1 : 0));

我想System.out.println&内置插件;)
大卫·威廉斯

1
刚刚意识到我在回答了3年后发表了评论...大声笑。
rajugaadu

7
public static void main(String[] args) 
{
    int i = 13;
    short s = 13;
    byte b = 13;

    System.out.println("i: " + String.format("%32s", 
            Integer.toBinaryString(i)).replaceAll(" ", "0"));

    System.out.println("s: " + String.format("%16s", 
            Integer.toBinaryString(0xFFFF & s)).replaceAll(" ", "0"));

    System.out.println("b: " + String.format("%8s", 
            Integer.toBinaryString(0xFF & b)).replaceAll(" ", "0"));

}

输出:

i: 00000000000000000000000000001101
s: 0000000000001101
b: 00001101

6

看看这个逻辑可以将数字转换为任何基数

public static void toBase(int number, int base) {
    String binary = "";
    int temp = number/2+1;
    for (int j = 0; j < temp ; j++) {
        try {
            binary += "" + number % base;

            number /= base;
        } catch (Exception e) {
        }
    }
    for (int j = binary.length() - 1; j >= 0; j--) {
        System.out.print(binary.charAt(j));
    }
}

要么

StringBuilder binary = new StringBuilder();
int n=15;
while (n>0) {
    if((n&1)==1){
        binary.append(1);
    }else
        binary.append(0);
    n>>=1;
}
System.out.println(binary.reverse());

1
输入为0时,`if(a == 0){binary.append(0); System.out.println(binary.toString()); 返回; }`我们需要在while循环上方的第二个解决方案中添加此行。
伊姆兰(Imran)

4

这是打印整数的内部二进制表示形式最简单方法例如:如果我们将n设为17,则输出将是:0000 0000 0000 0000 0000 0000 0000 0001 0001

void bitPattern(int n) {

        int mask = 1 << 31;
        int count = 0;
        while(mask != 0) {
            if(count%4 == 0)
                System.out.print(" ");

            if((mask&n) == 0) 

                System.out.print("0");



            else 
                System.out.print("1");


            count++;
            mask = mask >>> 1;


    }
    System.out.println();
}

4

只需尝试一下。如果范围仅是打印给定整数值的二进制值。它可以是正数或负数。

      public static void printBinaryNumbers(int n) {
        char[] arr = Integer.toBinaryString(n).toCharArray();
        StringBuilder sb = new StringBuilder();
        for (Character c : arr) {
          sb.append(c);
        }
        System.out.println(sb);
      }

输入

5

输出量

101


2

解决方案使用32位显示掩码,

public static String toBinaryString(int n){

    StringBuilder res=new StringBuilder();
    //res= Integer.toBinaryString(n); or
    int displayMask=1<<31;
    for (int i=1;i<=32;i++){
        res.append((n & displayMask)==0?'0':'1');
        n=n<<1;
        if (i%8==0) res.append(' ');
    }

    return res.toString();
}


 System.out.println(BitUtil.toBinaryString(30));


O/P:
00000000 00000000 00000000 00011110 

2

简单,最简单的解决方案。

public static String intToBinaryString(int integer, int numberOfBits) {

    if (numberOfBits > 0) {     // To prevent FormatFlagsConversionMismatchException.

        String nBits = String.format("%" + numberOfBits + "s",      // Int to bits conversion
                Integer.toBinaryString(integer))
                .replaceAll(" ","0"); 

        return nBits;   // returning the Bits for the given int.
    }

    return null;        // if the numberOfBits is not greater than 0, returning null.
}

1

对于这个问题,这里已经有很好的答案了。但是,这就是我自己尝试过的方式(可能是基于最简单的逻辑→ modulo / divide / add):

        int decimalOrBinary = 345;
        StringBuilder builder = new StringBuilder();

        do {
            builder.append(decimalOrBinary % 2);
            decimalOrBinary = decimalOrBinary / 2;
        } while (decimalOrBinary > 0);

        System.out.println(builder.reverse().toString()); //prints 101011001

0

这个问题在Java(可能还有其他语言)中很棘手。

Integer是32位带符号数据类型,但是Integer.toBinaryString()返回整数参数的字符串表示形式,为基数2中的无符号整数。

因此,Integer.parseInt(Integer.toBinaryString(X),2)可以生成异常(有符号对无符号)。

安全的方法是使用Integer.toString(X,2); 这会产生一些不太优雅的东西:

-11110100110

但是它有效!!!


他想打印它,而不是分析它。
洛恩侯爵,

System.out.println(Integer.toString(X,2));
忍者

0

我认为这是迄今为止最简单的算法(对于那些不想使用内置函数的人):

public static String convertNumber(int a)  { 
              StringBuilder sb=new StringBuilder();
              sb.append(a & 1);
              while ((a>>=1) != 0)  { 
                  sb.append(a & 1);
               }
              sb.append("b0");
              return sb.reverse().toString();
  }

例:

convertNumber(1) -> “ 0b1”

convertNumber(5) -> “ 0b101”

convertNumber(117) -> “ 0b1110101”

工作原理: while循环将数字右移(用倒数第二个代替最后一位,等等),获取最后一位的值并将其放入StringBuilder中,重复执行直到没有剩余位为止(那是a = 0)。


0
    for(int i = 1; i <= 256; i++)
    {
        System.out.print(i + " "); //show integer
        System.out.println(Integer.toBinaryString(i) + " "); //show binary
        System.out.print(Integer.toOctalString(i) + " "); //show octal
        System.out.print(Integer.toHexString(i) + " "); //show hex

    }

3
非常感谢您的回答,但是请添加更多的描述和/或信息,以及如何解决所
遇到的

0

尝试这种方式:

public class Bin {
  public static void main(String[] args) {
    System.out.println(toBinary(0x94, 8));
  }

  public static String toBinary(int a, int bits) {
    if (--bits > 0)
        return toBinary(a>>1, bits)+((a&0x1)==0?"0":"1");
    else 
        return (a&0x1)==0?"0":"1";
  }

}

10010100


0

给定int x的二进制表示形式,左填充零:

org.apache.commons.lang3.StringUtils.leftPad(Integer.toBinaryString(x), 32, '0')

0

输入任何十进制数字作为输入。之后,我们进行模和除等运算,将给定的输入转换为二进制数。这是将整数值转换为二进制的Java程序的源代码,该二进制的位数为十进制数。Java程序已成功编译并在Windows系统上运行。程序输出也如下所示。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int integer ;
        String binary = "";    //   here we count "" or null 
                               //   just String binary = null;
        System.out.print("Enter the binary Number: ");
        integer = sc.nextInt();

        while(integer>0)
        {
            int x = integer % 2;
            binary = x + binary;
            integer = integer / 2;  
        }
        System.out.println("Your binary number is : "+binary);
        System.out.println("your binary length : " + binary.length());
    }
}

0

由于没有答案被接受,因此您的问题可能是关于如何在二进制文件中存储整数。您可能正在寻找java.io.DataOutputStream:https : //docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html

DataOutputStream os = new DataOutputStream(outputStream);
os.writeInt(42);
os.flush();
os.close();

2
大多数情况下,打印意味着将某些内容写入控制台,而不是存储在文件中。如果要求将数据序列化到文件,您的答案可能会很有用。
阿兰·米歇尔·乔姆努埃

当然可以,但是由于提问者不接受任何答案,我猜他的问题是不正确的。
Christian Charbula

0

您可以使用位掩码(1 << k)并对数字进行AND操作!1 << k在k位置只有一位!

private void printBits(int x) {
    for(int i = 31; i >= 0; i--) {
        if((x & (1 << i)) != 0){
            System.out.print(1);
        }else {
            System.out.print(0);
        }
    }
    System.out.println();
}

-2

它使用强大的位操作来处理有符号和无符号值,并在左侧生成第一个零。

public static String representDigits(int num) {

        int checkBit = 1 << (Integer.SIZE * 8 - 2 );    // avoid the first digit        
        StringBuffer sb = new StringBuffer();

        if (num < 0 ) {     // checking the first digit
            sb.append("1");
        } else {
            sb.append("0");
        }

        while(checkBit != 0) {          
            if ((num & checkBit) == checkBit){
                sb.append("1");
            } else {
                sb.append("0");
            }           
            checkBit >>= 1;     
        }       

        return sb.toString();
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.