ما هي أفضل طريقة للتغلب على حقيقة أن كافة بايتات Java موقعة؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

في Java، لا يوجد شيء اسمه بايت غير موقع.

من خلال العمل مع بعض التعليمات البرمجية ذات المستوى المنخفض، تحتاج أحيانًا إلى العمل مع وحدات البايت التي تحتوي على قيم غير موقعة أكبر من 128، مما يجعل Java تفسرها على أنها رقم سالب بسبب استخدام MSB للتوقيع.

ما هي الطريقة الجيدة للتغلب على هذا؟(قول لا تستخدم Java ليس خيارًا)

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

المحلول

عند قراءة أي قيمة مفردة من المصفوفة، انسخها إلى شيء مثل قيمة قصيرة أو int وقم بتحويل الرقم السالب يدويًا إلى القيمة الموجبة التي ينبغي أن تكون.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

يمكنك إجراء تحويل مماثل عند الكتابة في المصفوفة.

نصائح أخرى

من الممكن بالفعل التخلص من عبارة if والإضافة إذا قمت بذلك بهذه الطريقة.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

بهذه الطريقة، لا تفسر Java البايت كرقم سالب وتقلب بت الإشارة على العدد الصحيح أيضًا.

يعد استخدام ints أفضل بشكل عام من استخدام Shorts لأن Java تستخدم قيم 32 بت داخليًا على أي حال (حتى بالنسبة للبايتات، ما لم تكن في مصفوفة) لذا فإن استخدام ints سيتجنب التحويل غير الضروري من/إلى القيم القصيرة في الكود الثانوي.

ربما يكون أفضل رهان لك هو استخدام عدد صحيح بدلاً من البايت.يحتوي على مساحة للسماح بأرقام أكبر من 128 دون الحاجة إلى إنشاء كائن خاص لاستبدال البايت.

هذا ما يقترحه أيضًا الأشخاص الأكثر ذكاءً مني (الجميع)

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

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

ولهذا السبب، من الأفضل أن تلتزم بالعدد الصحيح وتخفيه للحصول على البتات التي تهمك.مثال:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

فيما يلي بعض المعلومات الإضافية حول أنواع Java البدائية http://mindprod.com/jgloss/primitive.html

ملاحظة أخيرة تافهة، هناك رقم دقة ثابت غير موقّع في Java.هذا هو شار بدائية.

أعلم أن هذا رد متأخر جدًا، لكنني صادفت هذا الموضوع عندما كنت أحاول القيام بنفس الشيء بالضبط.تحاول المشكلة ببساطة تحديد ما إذا كان بايت Java أكبر من 127.

الحل البسيط هو:

if((val & (byte)0x80) != 0) { ... }

إذا كانت المشكلة الحقيقية هي> 128 بدلاً من ذلك، فإن مجرد إضافة شرط آخر إلى عبارة if هذه سيفي بالغرض.

أعتقد أنه يمكنك فقط استخدام قصيرة لتخزينها.ليست فعالة جدًا، ولكنها في الحقيقة الخيار الوحيد إلى جانب بعض الجهود الشاقة التي رأيتها.

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