سؤال

اسمحوا لي أن أبدأ بالقول إنني لم أعمل أبدًا مع البتات من قبل في البرمجة. لديّ كائن يمكن أن يكون في 3 حالات وأريد تمثيل تلك الحالات باستخدام صفيف 3 بت.
علي سبيل المثال:

لدي سيارة سباق ويمكن أن تمضي إلى الأمام ، اليسار ، وفي موقف لا يزال البتات 000
إذا كانت السيارة تتحرك للأمام ، فستكون البتات 010 إذا كانت للأمام وتركها ستكون 110 وما إلى ذلك ...

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

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

المحلول

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

هذا يشفر للسرعات: الوقوف ، اليسار ، اليسار _forward ، إلى الأمام ، يمين _ فوروارد ، واليمين.

public class Moo {

final static byte FORWARD = 0x1; // 00000001
final static byte LEFT     =0x2; // 00000010
final static byte RIGHT    =0x4; // 00000100

/**
 * @param args
 */
public static void main(String[] args) {

    byte direction1 = FORWARD|LEFT;  // 00000011
    byte direction2 = FORWARD|RIGHT; // 00000101
    byte direction3 = FORWARD|RIGHT|LEFT; // 00000111

    byte direction4 = 0;

    // someting happens:
    direction4 |= FORWARD;
    // someting happens again.
    direction4 |= LEFT;

    System.out.printf("%x: %s\n", direction1, dirString(direction1));
    System.out.printf("%x: %s\n", direction2, dirString(direction2));
    System.out.printf("%x: %s\n", direction3, dirString(direction3));
    System.out.printf("%x: %s\n", direction4, dirString(direction4));


}

public static String dirString( byte direction) {
    StringBuilder b = new StringBuilder("Going ");

    if( (direction & FORWARD) > 0){
        b.append("forward ");
    }

    if( (direction & RIGHT) > 0){
        b.append("turning right ");
    }
    if( (direction & LEFT) > 0){
        b.append("turning left ");
    }
    if( (direction &( LEFT|RIGHT)) == (LEFT|RIGHT)){
        b.append(" (conflicting)");
    }

    return b.toString();
}

}

انتاج:

3: Going forward turning left 
5: Going forward turning right 
7: Going forward turning right turning left  (conflicting)
3: Going forward turning left 

لاحظ أيضًا أن اليسار واليمين حصريين بشكل متبادل ، لذلك من الممكن إنشاء مزيج غير قانوني. (7 = 111)

إذا كنت تعني فعليًا أن هناك شيء لا يمكن أن يتحرك يسارًا أو إلى الأمام أو يمينًا ، فأنت لا تحتاج إلى أعلام ، فقط تعداد.

هذا التعداد ممكن للنقل في اثنين فقط بت.

    enum Direction{
    NONE, FORWARD, RIGHT, LEFT;

}


Direction dir = Direction.FORWARD;
byte enc = (byte) dir.ordinal();

الأخيرين بتات في enc سيصبح:

00 : none  
01 : forward;
10 : right
11 : left

نصائح أخرى

أود أن أقترح استخدام bitset جنبا إلى جنب مع التعداد

enum State { LEFT, RIGHT, FORWARD,STAND_STILL}

BitSet stat=new BitSet(4);

void setLeft() // and so on for each state
{
 stat.set(State.LEFT);
}
boolean isLeft()
{
 stat.get(State.LEFT);
}
void reset() //reset function to reset the state
{
  stat.clear();
}

أقل ما ستحتاجه لتخزين هذه الأجزاء الثلاثة هو واحد byte.

اقرأ هذا البرنامج التعليمي على مشغلي bitwise للبدء.

تعديل: هذه الصفحة على أقنعة بت قد تكون مفيدة للغاية.

أنت تقول ثلاث ولايات ، لكنك حصلت بالفعل على ست ولايات: إلى الأمام ، إلى الأمام ، اليسار إلى الأمام ، اليسار ، اليمين ، والوقوف. ما لم تكن سيارة السباق لا تتحرك بشكل جانبي ، فستكون لديك أربعة.

يجب أن تستخدم حقا التعداد لهذا:

enum State { FORWARD, FORWARD_LEFT, FORWARD_RIGHT, STAND_STILL }

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

في Java.Util هناك فئة تسمى bitset وهذا يجعل التلاعب بت بسيط جدا.

في حالتك ، يمكنك إنشاء مجموعة من الحجم 3 ثم استخدام أساليب GET () وتعيين () لتعيين BITS.

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