জাভাতে কোনও পূর্ণসংখ্যার 0-প্যাডযুক্ত বাইনারি উপস্থাপনা কীভাবে পাবেন?


120

উদাহরণস্বরূপ, 1, 2, 128, 256আউটপুট জন্য হতে পারে (16 অঙ্ক):

0000000000000001
0000000000000010
0000000010000000
0000000100000000

আমি চেষ্টা করেছিলাম

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

এটি বাম-প্যাডিংয়ের জন্য স্থান রাখে:

`               1'

0প্যাডিংয়ের জন্য কীভাবে রাখবেন । আমি এটি ফর্ম্যাটারে খুঁজে পাইনি । এটি করার অন্য কোনও উপায় আছে?

PS এই পোস্টটি বাম 0-প্যাডিং সহ পূর্ণসংখ্যা বিন্যাস করার পদ্ধতি বর্ণনা করে তবে এটি বাইনারি উপস্থাপনের জন্য নয়।


আপনি ব্যবহার চেষ্টা করেছেন %016s?
ডেনিজ ডোগান

1
@ ডেনিজ হ্যাঁ, এটি দিয়ে ব্যর্থ হয়Exception in thread "main" java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
খচিক

: এই কটাক্ষপাত করা stackoverflow.com/a/15124135/1316649
fstang

উত্তর:


198

আমি এটি একটি suboptimal সমাধান মনে করি, তবে আপনি করতে পারেন

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

1
হ্যাঁ, আমি এখনই এটি করি তবে আমি বিশ্বাস করি যে আরও একটি উপায় হওয়া উচিত :) আপনাকে ধন্যবাদ।
খচিক

আসলে কিছু গবেষণা করার পরে, দেখে মনে হচ্ছে আপনি প্রিন্টফ সিন্ট্যাক্স ব্যবহার করে এটি করতে পারবেন না .. সুতরাং সম্ভবত এটি এতটা খারাপ নয়।
স্যামুয়েল পার্সোনেজ

@ ড্যানিয়েল নেতিবাচক সংখ্যাটিতে কোনও স্থান থাকবে না, তাই এটি কাজ করে।
এরিক ওয়াং

@ ড্যানিয়েল পূর্ণসংখ্যা :: টু বাইনারিস্ট্রিং ডক:Returns a string representation of the integer argument as an unsigned integer in base 2.
অ্যালান

17

জাভা.ইটিল.ফর্ম্যাটরে কোনও বাইনারি রূপান্তর নেই, আমি আপনাকে পরামর্শ দিচ্ছি যে হয় হয় শূন্যের সাথে স্থানের অক্ষর প্রতিস্থাপনের জন্য স্ট্রিং.রেপ্লেস ব্যবহার করুন:

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

বা এটিকে দেওয়া রেখাগুলির সাথে কোথাও যুক্ত বাম প্যাডিংয়ের সাথে পূর্ণসংখ্যাগুলি বাইনারি উপস্থাপনায় রূপান্তর করতে আপনার নিজস্ব যুক্তি বাস্তবায়ন করুন । অথবা যদি আপনাকে ফর্ম্যাট করতে সত্যিই সংখ্যাগুলি পাস করার প্রয়োজন হয় তবে আপনি আপনার বাইনারি উপস্থাপনাটিকে বিগইন্টেজারে রূপান্তর করতে পারেন এবং তারপরে এটি শীর্ষস্থানীয় শূন্যগুলির সাথে ফর্ম্যাট করতে পারেন, তবে রানটাইমে এটি খুব ব্যয়বহুল, যেমন:

String.format("%016d", new BigInteger(Integer.toBinaryString(1)))

ধন্যবাদ, এটি আরও ভাল, যেহেতু এটি বড় সংখ্যায় (যেমন 2 ^ 30) ওভারফ্লো এড়িয়ে চলে।
খচিক

1
হ্যাঁ, তবে আমি সত্যিই এটি করব না, আমি হয় প্রতিস্থাপন পদ্ধতি বা আমার নিজস্ব প্যাডিং পদ্ধতি ব্যবহার করব: একটি উপায় হ'ল যুক্তি শূন্যের সাথে প্রয়োজনীয় প্যাডিংয়ের দৈর্ঘ্যের বিন্যাস করতে স্ট্রিং.ফর্ম্যাটটি আবার ব্যবহার করা বা কোডে: স্ট্রিং.ফোর্ম্যাট ( "% 0" + (32 - বাইনারি. দৈর্ঘ্য ()) + "ডি"% s ", 0, বাইনারি) অবশ্যই আপনাকে 32 - বাইনারি দৈর্ঘ্যের () ... এর নেতিবাচক ফলাফলগুলি দেখার প্রয়োজন হবে ...
জোরান Regvart

12

আপনি অ্যাপাচি কমন্স স্ট্রিং ইউটিলস ব্যবহার করতে পারেন । এটি প্যাডিং স্ট্রিংয়ের জন্য পদ্ধতি সরবরাহ করে:

StringUtils.leftPad(Integer.toBinaryString(1), 16, '0');

9

আমি এই ধরণের কাজটি করার আগে আমি সত্যিই ব্যবহার করি নি এমন সমস্ত ধরণের পদ্ধতির কল চেষ্টা করেছিলাম, তারা মাঝারি সাফল্যের সাথে কাজ করেছিল, যতক্ষণ না আমি এত সহজ যে কোনও কাজটি সম্ভবত এটি কার্যকর হতে পারে তা ভেবেছিলাম, এবং তা হয়েছিল!

আমি নিশ্চিত যে এটি আগে চিন্তা করা হয়েছিল, নিশ্চিত নয় যে এটি বাইনারি কোডগুলির দীর্ঘ স্ট্রিংয়ের জন্য কোনও ভাল তবে এটি 16 বিট স্ট্রিংয়ের জন্য সূক্ষ্মভাবে কাজ করে। আশা করি এটা সাহায্য করবে!! (নোটের দ্বিতীয় অংশের কোডটি উন্নত করা হয়েছে)

String binString = Integer.toBinaryString(256);
  while (binString.length() < 16) {    //pad with 16 0's
        binString = "0" + binString;
  }

এই উত্তরটিকে একটি লুপ দিয়ে কাজ করতে সাহায্য করার জন্য উইলের ধন্যবাদ Thanks এটি সম্ভবত কিছু আনাড়ি তবে এটি কাজ করে, দয়া করে উন্নতি করুন এবং যদি পারেন তবে ফিরে মন্তব্য করুন ...

binString = Integer.toBinaryString(256);
int length = 16 - binString.length();
char[] padArray = new char[length];
Arrays.fill(padArray, '0');
String padString = new String(padArray);
binString = padString + binString;

এটি একটি দুর্দান্ত এবং সাধারণ সমাধান। এটা তোলে মধ্যে পার্থক্য ব্যবহার করে উন্নত করা যেতে পারে binString.length(): এই উত্তর ভালো কিছু সঙ্গে যদিও এবং 16 একটি স্ট্রিং তৈরি করতে এবং তারপর binString যে স্ট্রিং সংযোজন বদলে লুপিং stackoverflow.com/a/2804866/1353098
উইল

1
উইল - আপনি মেধাবী, এই মুহূর্তে আমার কোডে অসুস্থ রাখুন! আমি লুপ পছন্দ করি না, থ্যানকিউ !!!
টম স্পেন্সার

7

পুরানো পোস্টের জন্য এখানে একটি নতুন উত্তর।

নির্দিষ্ট দৈর্ঘ্যে শীর্ষস্থানীয় শূন্যগুলির সাথে বাইনারি মান প্যাড করতে, এটি চেষ্টা করুন:

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

যদি len = 4এবং val = 1,

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

স্ট্রিং ফেরৎ "10001", তারপর

"10001".substring( 1 )

প্রথম চরিত্রটি বাতিল করে দেয়। সুতরাং আমরা যা চাই তা অর্জন করি:

"0001"

যদি valনেতিবাচক হওয়ার সম্ভাবনা থাকে তবে চেষ্টা করুন:

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

5

ব্যবহারকারী 3608934 এর ধারণার একটি সহজ সংস্করণ "এটি একটি পুরাতন কৌশল, 16% এর সাথে একটি স্ট্রিং তৈরি করুন তারপরে আপনি যে ছাঁটা ছাঁটা বাইনারি স্ট্রিং যুক্ত করুন":

private String toBinaryString32(int i) {
    String binaryWithOutLeading0 = Integer.toBinaryString(i);
    return "00000000000000000000000000000000"
            .substring(binaryWithOutLeading0.length())
            + binaryWithOutLeading0;
}

4

আমি "ডান" সমাধানটি জানি না তবে আমি আপনাকে দ্রুত প্যাচ দেওয়ার পরামর্শ দিতে পারি।

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

আমি এটি চেষ্টা করে দেখেছি যে এটি ঠিকঠাক কাজ করে।


ফরম্যাটারটি কেন কেবল 16 অক্ষর প্রস্থ? কেন না %32s?
রিং বহনকারী

3

চেষ্টা করুন ...

String.format("%016d\n", Integer.parseInt(Integer.toBinaryString(256)));

আমি মনে করি না এটি এটি করার "সঠিক" উপায় ... তবে এটি কার্যকর হয় :)


1
এটি অবশ্যই এটা একটি দরিদ্র উপায় কারণ এটি শুধুমাত্র ইনপুট মান একটি ছোট ভগ্নাংশ .... বৃহত্তম আউটপুট এটা সফলভাবে উত্পাদন করা হয় করতে আপ কাজ করে 0000001111111111ইনপুট মান জন্য 1023কোন মান চেয়ে বড় আউটপুট থেকে উত্পাদন করা হবে toBinaryString(1024)এর 10000000000কোন এত বড় parseInt(...)এইভাবে, ইনপুটটি কেবলমাত্র 1 কে 64 কে সম্ভাব্য ইনপুট মানগুলির জন্য কাজ করে
রোল্ফল

1

কাজ হবে এমন একটি নিষ্পাপ সমাধান

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

অন্য একটি পদ্ধতি হবে

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

এটি পূর্ণসংখ্যা 5 এর 16 বিট স্ট্রিং তৈরি করবে


1

জাভা 11 দিয়ে শুরু করে আপনি পুনরাবৃত্তি (...) পদ্ধতিটি ব্যবহার করতে পারেন :

"0".repeat(Integer.numberOfLeadingZeros(i) - 16) + Integer.toBinaryString(i)

অথবা, যদি আপনার কোনও পূর্ণসংখ্যার 32-বিট উপস্থাপনা প্রয়োজন:

"0".repeat(Integer.numberOfLeadingZeros(i != 0 ? i : 1)) + Integer.toBinaryString(i)

0

এটি একটি পুরানো কৌশল, স্ট্রিং.ফর্ম্যাট ("% s", ইন্টিজার.টোবাইনারিস্ট্রিং (1)) থেকে আপনি ছাঁটা বাইনারি স্ট্রিং সংযোজন করুন এবং 16-এর দশকে একটি স্ট্রিং তৈরি করুন এবং কোনও শীর্ষস্থানীয়কে ফাঁকে রেখে ডান-সর্বাধিক 16 টি অক্ষর ব্যবহার করুন 0 এর। আরও ভাল, একটি ফাংশন তৈরি করুন যা আপনাকে বাইনারি স্ট্রিংয়ের কতক্ষণ চাই তা নির্দিষ্ট করতে দেয়। অবশ্যই গ্রন্থাগারগুলি সহ এটি সম্পন্ন করার জন্য সম্ভবত এক হাজার কোটি উপায় রয়েছে তবে আমি একটি বন্ধুকে সাহায্য করতে এই পোস্টটি যুক্ত করছি :)

public class BinaryPrinter {

    public static void main(String[] args) {
        System.out.format("%d in binary is %s\n", 1, binaryString(1, 4));
        System.out.format("%d in binary is %s\n", 128, binaryString(128, 8));
        System.out.format("%d in binary is %s\n", 256, binaryString(256, 16));
    }

    public static String binaryString( final int number, final int binaryDigits ) {
        final String pattern = String.format( "%%0%dd", binaryDigits );
        final String padding = String.format( pattern, 0 );
        final String response = String.format( "%s%s", padding, Integer.toBinaryString(number) );

        System.out.format( "\npattern = '%s'\npadding = '%s'\nresponse = '%s'\n\n", pattern, padding, response );

        return response.substring( response.length() - binaryDigits );
    }
}

0

আমি নীচের মত পদ্ধতিটি দিয়ে আমার নিজস্ব ব্যবহারের ক্লাস লিখব

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));
}

}

আউটপুট:

5
101
0000000000000000000000000000000000000000000000000000000000000101

একই পদ্ধতির কোনও অবিচ্ছেদ্য ধরণের ক্ষেত্রে প্রয়োগ করা যেতে পারে। মুখোশের ধরণের দিকে মনোযোগ দিন

long mask = 1L << i;


0

এই পদ্ধতিটি কোনও স্ট্রিং, দৈর্ঘ্য = বিটগুলিতে একটি রূপান্তর করে। হয় 0 টি প্যাডযুক্ত বা সবচেয়ে উল্লেখযোগ্য বিটগুলি কেটে দেওয়া হয়েছে।

static String toBitString( int x, int bits ){
    String bitString = Integer.toBinaryString(x);
    int size = bitString.length();
    StringBuilder sb = new StringBuilder( bits );
    if( bits > size ){
        for( int i=0; i<bits-size; i++ )
            sb.append('0');
        sb.append( bitString );
    }else
        sb = sb.append( bitString.substring(size-bits, size) );

    return sb.toString();
}

0

আপনি lib https://github.com/kssource/BitSequence ব্যবহার করতে পারেন । এটি একটি সংখ্যা গ্রহণ করে এবং বাইয়ারি স্ট্রিং, প্যাডযুক্ত এবং / অথবা গোষ্ঠীভিত্তিক ফেরত দেয়।

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
for(int i=0;i<n;i++)
{
  for(int j=str[i].length();j<4;j++)
  str[i]="0".concat(str[i]);
}

str[i].length()বাইনারিতে সংখ্যার দৈর্ঘ্য 2 বলুন 01 যা দৈর্ঘ্য 2 পরিবর্তন 4 সংখ্যার কাঙ্ক্ষিত সর্বাধিক দৈর্ঘ্যে। এটি ও (এন) এ অনুকূলিত হতে পারে। চালিয়ে ব্যবহার করে।


0

// নীচে সঠিক আকারগুলি পরিচালনা করবে

public static String binaryString(int i) {
    return String.format("%" + Integer.SIZE + "s", Integer.toBinaryString(i)).replace(' ', '0');
}

public static String binaryString(long i) {
    return String.format("%" + Long.SIZE + "s", Long.toBinaryString(i)).replace(' ', '0');
}

0
import java.util.Scanner;
public class Q3{
  public static void main(String[] args) {
    Scanner scn=new Scanner(System.in);
    System.out.println("Enter a number:");
    int num=scn.nextInt();
    int numB=Integer.parseInt(Integer.toBinaryString(num));
    String strB=String.format("%08d",numB);//makes a 8 character code
    if(num>=1 && num<=255){
     System.out.println(strB);
    }else{
        System.out.println("Number should be in range between 1 and 255");
    }
  }
}

1
numBএবং num
কোনওভাবেই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.