How to get 0-padded binary representation of an integer in java?

前端 未结 17 1911
我在风中等你
我在风中等你 2020-11-22 08:23

for example, for 1, 2, 128, 256 the output can be (16 digits):

0000000000000001
0000000000000010
0000000010000000
0000000100000000
相关标签:
17条回答
  • 2020-11-22 08:30

    I would write my own util class with the method like below

    public class NumberFormatUtils {
    
    public static String longToBinString(long val) {
        char[] buffer = new char[64];
        Arrays.fill(buffer, '0');
        for (int i = 0; i < 64; ++i) {
            long mask = 1L << i;
            if ((val & mask) == mask) {
                buffer[63 - i] = '1';
            }
        }
        return new String(buffer);
    }
    
    public static void main(String... args) {
        long value = 0b0000000000000000000000000000000000000000000000000000000000000101L;
        System.out.println(value);
        System.out.println(Long.toBinaryString(value));
        System.out.println(NumberFormatUtils.longToBinString(value));
    }
    

    }

    Output:

    5
    101
    0000000000000000000000000000000000000000000000000000000000000101
    

    The same approach could be applied to any integral types. Pay attention to the type of mask

    long mask = 1L << i;

    0 讨论(0)
  • 2020-11-22 08:33

    You can use Apache Commons StringUtils. It offers methods for padding strings:

    StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');
    
    0 讨论(0)
  • 2020-11-22 08:33

    Here a new answer for an old post.

    To pad a binary value with leading zeros to a specific length, try this:

    Integer.toBinaryString( (1 << len) | val ).substring( 1 )
    

    If len = 4 and val = 1,

    Integer.toBinaryString( (1 << len) | val )
    

    returns the string "10001", then

    "10001".substring( 1 )
    

    discards the very first character. So we obtain what we want:

    "0001"
    

    If val is likely to be negative, rather try:

    Integer.toBinaryString( (1 << len) | (val & ((1 << len) - 1)) ).substring( 1 )
    
    0 讨论(0)
  • 2020-11-22 08:34

    There is no binary conversion built into the java.util.Formatter, I would advise you to either use String.replace to replace space character with zeros, as in:

    String.format("%16s", Integer.toBinaryString(1)).replace(" ", "0")
    

    Or implement your own logic to convert integers to binary representation with added left padding somewhere along the lines given in this so. Or if you really need to pass numbers to format, you can convert your binary representation to BigInteger and then format that with leading zeros, but this is very costly at runtime, as in:

    String.format("%016d", new BigInteger(Integer.toBinaryString(1)))
    
    0 讨论(0)
  • 2020-11-22 08:38

    A naive solution that work would be

    String temp = Integer.toBinaryString(5);
    while (temp.length() < Integer.SIZE) temp = "0"+temp; //pad leading zeros
    temp = temp.substring(Integer.SIZE - Short.SIZE); //remove excess
    

    One other method would be

    String temp = Integer.toBinaryString((m | 0x80000000));
    temp = temp.substring(Integer.SIZE - Short.SIZE);
    

    This will produce a 16 bit string of the integer 5

    0 讨论(0)
  • 2020-11-22 08:41

    You can use lib https://github.com/kssource/BitSequence. It accept a number and return bynary string, padded and/or grouped.

    String s = new BitSequence(2, 16).toBynaryString(ALIGN.RIGHT, GROUP.CONTINOUSLY));  
    return  
    0000000000000010  
    
    another examples:
    
    [10, -20, 30]->00001010 11101100 00011110
    i=-10->00000000000000000000000000001010
    bi=10->1010
    sh=10->00 0000 0000 1010
    l=10->00000001 010
    by=-10->1010
    i=-10->bc->11111111 11111111 11111111 11110110
    
    0 讨论(0)
提交回复
热议问题