(Java) تحديد عدد البتات (الطول) عند تحويل الرقم الثنائي إلى سلسلة؟
سؤال
أحاول تخزين رقم كسلسلة ثنائية في مصفوفة ولكنني بحاجة إلى تحديد عدد البتات التي سيتم تخزينها بها.
على سبيل المثال، إذا كنت بحاجة إلى تخزين 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
اقتباس فقرة>