(Java) تحديد عدد البتات (الطول) عند تحويل الرقم الثنائي إلى سلسلة؟

StackOverflow https://stackoverflow.com/questions/625838

  •  05-07-2019
  •  | 
  •  

سؤال

أحاول تخزين رقم كسلسلة ثنائية في مصفوفة ولكنني بحاجة إلى تحديد عدد البتات التي سيتم تخزينها بها.

على سبيل المثال، إذا كنت بحاجة إلى تخزين 0 ببتين، فأنا بحاجة إلى سلسلة "00".أو 1010 مع 6 بتات لذلك "001010".

هل أستطيع مساعدتك؟

يحرر:شكرًا يا رفاق، نظرًا لأنني لا أجيد الرياضيات/البرمجة بشكل عام، فقد اخترت الحل الأبسط وهو حل ديفيد.شيء مثل:

binaryString.append(Integer.toBinaryString(binaryNumber));
for(int n=binaryString.length(); n<numberOfBits; n++) {
                        binaryString.insert(0, "0");
}

يبدو أنه يعمل بشكل جيد، لذلك ما لم يكن غير فعال للغاية فسأتبعه.

هل كانت مفيدة؟

المحلول

استخدم Integer.toBinaryString() ثم التحقق من طول السلسلة وإضافة قبل ذلك مع العديد من الأصفار ما تحتاج إليه لجعل طول المطلوب.

نصائح أخرى

ننسى الحلول محلية الصنع.استخدم المعيار BigInteger بدلاً من.يمكنك تحديد عدد البتات ثم استخدام طريقة toString(int radix) لاستعادة ما تحتاجه (أفترض أنك بحاجة إلى radix=2).

يحرر: سأترك التحكم في البت لـ BigInteger.سيقوم الكائن بتغيير حجم المخزن المؤقت للبت الخاص به داخليًا ليناسب بُعد الرقم الجديد.علاوة على ذلك، يمكن تنفيذ العمليات الحسابية عن طريق هذا الكائن (ليس عليك تنفيذ المضافات/المضاعفات الثنائية وما إلى ذلك).هنا مثال أساسي:

package test;

import java.math.BigInteger;

public class TestBigInteger
{
    public static void main(String[] args)
    {
        String value = "1010";
        BigInteger bi = new BigInteger(value,2);
        // Arithmetic operations
        System.out.println("Output: " + bi.toString(2));
        bi = bi.add(bi); // 10 + 10
        System.out.println("Output: " + bi.toString(2));
        bi = bi.multiply(bi); // 20 * 20
        System.out.println("Output: " + bi.toString(2));

        /*
         * Padded to the next event number of bits
         */
        System.out.println("Padded Output: " + pad(bi.toString(2), bi.bitLength() + bi.bitLength() % 2));
    }

    static String pad(String s, int numDigits)
    {
        StringBuffer sb = new StringBuffer(s);
        int numZeros = numDigits - s.length();
        while(numZeros-- > 0) { 
            sb.insert(0, "0");
        }
        return sb.toString();
    }
}

وهذه مشكلة المنزلية الشائعة. هناك حلقة الرائعة التي يمكنك كتابة من شأنها أن حساب أصغر قوة 2> = العدد المستهدف الخاص بك ن .

وبما أنه من قوة 2، لوغاريتم قاعدة 2 هو عدد البتات. لكن المكتبة math جافا لا يقدم سوى اللوغاريتم الطبيعي.

math.log( n ) / math.log(2.0) 

هو عدد البتات.

وحتى أبسط:

String binAddr = Integer.toBinaryString(Integer.parseInt(hexAddr, 16));  
String.format("%032", new BigInteger(binAddr)); 

والفكرة هنا هي تحليل سلسلة الظهر في كرقم عشري مؤقتا (واحد فقط حتى يحدث أن تتكون من لتصفح جميع 1 و 0) ثم استخدام String.format ().

لاحظ أن لديك أساسا لاستخدام BigInteger، لأن السلاسل الثنائية بسرعة تجاوز عدد صحيح وطويل مما أدى إلى NumberFormatExceptions إذا حاولت استخدام Integer.fromString() أو Long.fromString().

وجرب هذا:

String binaryString = String.format("%"+Integer.toString(size)+"s",Integer.toBinaryString(19)).replace(" ","0");

وحيث يمكن أن يكون حجم أي عدد يرغب المستخدم

وهنا حل بسيط للقيم int. يجب أن يكون واضحا كيفية توسيع نطاقه ليشمل على سبيل المثال البايت، وما إلى ذلك.

public static String bitString(int i, int len) {
    len = Math.min(32, Math.max(len, 1));
    char[] cs = new char[len];
    for (int j = len - 1, b = 1; 0 <= j; --j, b <<= 1) {
        cs[j] = ((i & b) == 0) ? '0' : '1';
    }
    return new String(cs);
}

وهنا هو الإخراج من مجموعة من حالات الاختبار عينة:

  0   1                                0                                0
  0  -1                                0                                0
  0  40 00000000000000000000000000000000 00000000000000000000000000000000
 13   1                                1                                1
 13   2                               01                               01
 13   3                              101                              101
 13   4                             1101                             1101
 13   5                            01101                            01101
-13   1                                1                                1
-13   2                               11                               11
-13   3                              011                              011
-13   4                             0011                             0011
-13   5                            10011                            10011
-13  -1                                1                                1
-13  40 11111111111111111111111111110011 11111111111111111111111111110011

وبطبيعة الحال، كنت لوحدك لجعل المعلمة طول كافية لتمثيل القيمة بأكملها.

import java.util.BitSet;

public class StringifyByte {

    public static void main(String[] args) {
        byte myByte = (byte) 0x00;
        int length = 2;
        System.out.println("myByte: 0x" + String.valueOf(myByte));
        System.out.println("bitString: " + stringifyByte(myByte, length));

        myByte = (byte) 0x0a;
        length = 6;
        System.out.println("myByte: 0x" + String.valueOf(myByte));
        System.out.println("bitString: " + stringifyByte(myByte, length));
    }

    public static String stringifyByte(byte b, int len) {
        StringBuffer bitStr = new StringBuffer(len);
        BitSet bits = new BitSet(len);
        for (int i = 0; i < len; i++)
        {
           bits.set (i, (b & 1) == 1);
           if (bits.get(i)) bitStr.append("1"); else bitStr.append("0");
           b >>= 1;
        }
        return reverseIt(bitStr.toString());
    }

    public static String reverseIt(String source) {
        int i, len = source.length();
        StringBuffer dest = new StringBuffer(len);

        for (i = (len - 1); i >= 0; i--)
           dest.append(source.charAt(i));
        return dest.toString();
    }
}

وإخراج:

myByte: 0x0
bitString: 00
myByte: 0x10
bitString: 001010

وحتى هنا بدلا من 8 يمكنك كتابة طول المطلوب وأنه سيتم إلحاق الأصفار وفقا لذلك. إذا كان طول صحيح بك المذكورة يفوق عدد المذكورة ثم فإنه لن إلحاق أي الأصفار

وString.format("%08d",1111);

<اقتباس فقرة>   

وإخراج: 00001111

String.format("%02d",1111);
<اقتباس فقرة>   

والإخراج: 1111

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top