কিভাবে বাইনারি স্ট্রিংটিকে জাভায় বেস 10 সংখ্যায় রূপান্তর করতে হয়


108

আমার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে যা বাইনারি সংখ্যাগুলি উপস্থাপন করে (শীর্ষস্থানীয় জিরো ছাড়াই) যা আমি তাদের সংশ্লিষ্ট বেস 10 সংখ্যায় রূপান্তর করতে চাই। বিবেচনা:

binary 1011 becomes integer 11
binary 1001 becomes integer 9
binary   11 becomes integer 3   etc. 

এগিয়ে যাওয়ার সেরা উপায় কী? আমি সরাসরি রূপান্তর পদ্ধতি না পেয়ে java.lang.number। * অন্বেষণ করছি। Integer.parseInt(b)স্ট্রিংয়ের EQUAL এর পূর্ণসংখ্যার ফলস্বরূপ ... উদাহরণস্বরূপ, 1001 9 এর পরিবর্তে 1,001 হয়ে যায় ... এবং আউটপুট বেসের জন্য কোনও পরামিতি অন্তর্ভুক্ত বলে মনে হয় না। toBinaryStringরূপান্তর ভুল দিক না। আমার সন্দেহ হয় যে আমাকে একটি মাল্টিস্টেপ রূপান্তর করতে হবে, তবে পদ্ধতি বা উপক্লাসগুলির সঠিক সংমিশ্রণটি খুঁজে পেতে পারে না। আমি নিশ্চিত নই যে কতটা বড় জিরো বা এর অভাব একটি সমস্যা হবে। কারও কি আমাকে নির্দেশ করার জন্য কোনও ভাল দিক রয়েছে?



উত্তর:


263

আপনাকে করার প্রয়োজন র্যাডিক্স উল্লেখ । এখানে একটি ওভারলোড রয়েছে Integer#parseInt()যা আপনাকে অনুমতি দেয়।

int foo = Integer.parseInt("1001", 2);

1
পরিপূর্ণতা। আমি পার্সিয়ান্ট ডকুমেন্টেশনের দ্বিতীয় রেখাকে পুরোপুরি মিস করেছি যা রডিক্সের জন্য অনুমতি দেয়। স্বপ্নের মতো কাজ করে।
dwwilson66

1
শীর্ষস্থানীয় শূন্যগুলির সাথেও কি এটি কাজ করে? শুধু নিশ্চিত করছি, যদিও আমি এর কোনও কারণ দেখছি না।
সিদ্ধার্থ

@ নাগভূষণবাড়ির উদাহরণ? আপনি কি দু'জনের পরিপূরক প্রতিনিধিত্ব করছেন?
ম্যাট বল

18

এটি কাজ করতে পারে:

public int binaryToInteger(String binary) {
    char[] numbers = binary.toCharArray();
    int result = 0;
    for(int i=numbers.length - 1; i>=0; i--)
        if(numbers[i]=='1')
            result += Math.pow(2, (numbers.length-i - 1));
    return result;
}

আমি মনে করি এটি একরকম অপ্রয়োজনীয়। ক্লাসগুলির মধ্যে আপনার একটু সময় থাকলে এটি ঘটে।
হাসান

6
এটি আমার জন্য সহায়ক কারণ জাভা ইতিমধ্যে যা আছে তা ব্যবহার না করেই আমাকে রূপান্তরকরণের সাথে একটি স্কুল প্রকল্প করতে হবে
বকসনোর্ট 2

এর আগে কি কেউ পরীক্ষা করেছিল? এখানে নম্বর. দৈর্ঘ্য বিয়োগ সূচক 1 টি 2 দ্বারা গুণিত হয়েছে, যদি আমি ভুলভাবে ভুল না হয়ে আপনি 1 দিয়ে শুরু করেন এবং সেই মানটি 2 দিয়ে গুণ করেন তবে ফলাফলটি ধরুন এবং সেইটিকে 2 দিয়ে গুণ করুন যা আপনার 3 স্থান হবে এবং তাই চালু
ক্রিস্টোফার ক্যাবেজুডো রদ্রিগেজ

(কমেন্ট বাক্স স্নিপপেটসের জন্য ভাল নয়) এখানে আমি যে কোডটি আপনার ভিত্তিতে ব্যবহার করছি তা (আমি হারিয়ে গিয়েছিলাম এবং এটি একটি টেম্পলেট হিসাবে ব্যবহার করি) পাবলিক স্ট্যাটিক ইনটাইনারি টোইন্টিজার (স্ট্রিং বাইনারি) {চর [] সংখ্যাগুলি = বাইনারি.টোচারার (); int ফলাফল = 0; int posValue = 1; (int i = সংখ্যা। দৈর্ঘ্য - 1; i> = 0; i--) {যদি (সংখ্যা [i] == '1') {ফলাফল + = পোস্টভ্যালু; } posValue * = 2; } রিটার্ন ফলাফল; }
ক্রিস্টোফার ক্যাবেজুডো রদ্রিগেজ

1
এই কোড স্নিপেট কাজ করছে না। forলুপ এবং নতুন resultভেরিয়েবলের গণনা সঠিক নয়।
চেষ্টা করুন

8
int foo = Integer.parseInt("1001", 2);

আপনি যদি ইতিবাচক সংখ্যার সাথে কাজ করে থাকেন তবে ঠিক কাজ করে তবে আপনাকে যদি স্বাক্ষরিত সংখ্যার সাথে ডিল করতে হয় তবে আপনার স্ট্রিংটি প্রসারিত করতে হবে এবং তারপরে একটি ইন্টারে রূপান্তর করতে হবে

public class bit_fun {
    public static void main(String[] args) {
        int x= (int)Long.parseLong("FFFFFFFF", 16);
        System.out.println("x =" +x);       

        System.out.println(signExtend("1"));
        x= (int)Long.parseLong(signExtend("1"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("0"));
        x= (int)Long.parseLong(signExtend("0"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("1000"));
        x= (int)Long.parseLong(signExtend("1000"), 2);
        System.out.println("x =" +x);

        System.out.println(signExtend("01000"));
        x= (int)Long.parseLong(signExtend("01000"), 2);
        System.out.println("x =" +x);
    }

    private static String signExtend(String str){
        //TODO add bounds checking
        int n=32-str.length();
        char[] sign_ext = new char[n];
        Arrays.fill(sign_ext, str.charAt(0));

        return new String(sign_ext)+str;
    }
}

output:
x =-1
11111111111111111111111111111111
x =-1
00000000000000000000000000000000
x =0
11111111111111111111111111111000
x =-8
00000000000000000000000000001000
x =8 

আমি আশা করি এটি সাহায্য করবে!


1
আমার -1 বাইনারি থেকে দশমিক রূপান্তরিত প্রয়োজন, আমি এটি করেছি। System.out.println ((int-) Long.parseLong ( "11111111111111111111111111111111", 2));
জিউস

5
static int binaryToInt (String binary){
    char []cA = binary.toCharArray();
    int result = 0;
    for (int i = cA.length-1;i>=0;i--){
        //111 , length = 3, i = 2, 2^(3-3) + 2^(3-2)
        //                    0           1  
        if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1);
    }
    return result;
}

2
public Integer binaryToInteger(String binary){
    char[] numbers = binary.toCharArray();
    Integer result = 0;
    int count = 0;
    for(int i=numbers.length-1;i>=0;i--){
         if(numbers[i]=='1')result+=(int)Math.pow(2, count);
         count++;
    }
    return result;
}

আমার ধারণা আমি আরও বেশি বিরক্ত! সঠিকভাবে কাজ করার জন্য হাসানের উত্তর পরিবর্তিত হয়েছে।


1

নেতিবাচক সংখ্যার সাথে কাজ করার চেষ্টা করার সময় আমার জন্য আমি নাম্বার ফর্ম্যাট এক্সপ্লেশন পেয়েছি। আমি নেতিবাচক এবং ধনাত্মক সংখ্যার জন্য নিম্নলিখিতটি ব্যবহার করেছি।

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      

Output : -9

0

নেতিবাচক সংখ্যার সাথে কাজ করার জন্য জাভা'র পূর্ণসংখ্যা.পার্সআইন্ট (পাঠ্য) এর স্থির সংস্করণ:

public static int parseInt(String binary) {
    if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2);

    int result = 0;
    byte[] bytes = binary.getBytes();

    for (int i = 0; i < bytes.length; i++) {
        if (bytes[i] == 49) {
            result = result | (1 << (bytes.length - 1 - i));
        }
    }

    return result;
}

0

আমি লুপ পছন্দ! হ্যাঁ!

String myString = "1001001"; //73

সঞ্চয়ের সাথে লুপ চলাকালীন, বাম থেকে ডানে ( lকোনও পরিবর্তন হয় না):

int n = 0,
    j = -1,
    l = myString.length();
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1);
return n;

2 লুপ ওয়ার্স সহ ডান থেকে বাম, জাভার কনভার্ট বুলিয়ান দ্বারা অনুপ্রাণিত (একেবারে ভয়ঙ্কর):

int n = 0,
    j = myString.length,
    i = 1;
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true);
return n >> 1;

কিছুটা আরও যুক্তিসঙ্গত বাস্তবায়ন:

int n = 0,
    j = myString.length(),
    i = 1;
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1);
return n >> 1;

একটি পঠনযোগ্য সংস্করণ: পি

int n = 0;
for (int j = 0; j < myString.length(); j++) {
    n *= 2;
    n += myString.charAt(j) == '0' ? 0 : 1;
}
return n;

0

আপনি যদি কর্মক্ষমতা সম্পর্কে চিন্তিত হন Integer.parseInt()এবং Math.pow()খুব ব্যয়বহুল হন। একই জিনিস দ্বিগুণ করার জন্য আপনি বিট ম্যানিপুলেশন ব্যবহার করতে পারেন (আমার অভিজ্ঞতার ভিত্তিতে):

final int num = 87;
String biStr = Integer.toBinaryString(num);

System.out.println(" Input Number: " + num + " toBinary "+ biStr);
int dec = binaryStringToDecimal(biStr);
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec));

কোথায়

int binaryStringToDecimal(String biString){
  int n = biString.length();      
  int decimal = 0;
  for (int d = 0; d < n; d++){
    // append a bit=0 (i.e. shift left) 
    decimal = decimal << 1;

    // if biStr[d] is 1, flip last added bit=0 to 1 
    if (biString.charAt(d) == '1'){
      decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111
    }
  }
  return decimal;
}

আউটপুট:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.