سؤال

لدي 4 الثنائية بت

Bit 3  Bit 2  Bit 1  Bit 0

عادة الجواب بسيط:2^4 أو 16 مجموعات مختلفة ؛ وسوف تبدو شيئا مثل التالية:

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

ومع ذلك ، فإن LSB (بت 0) التغيرات الدولة كل التكرار.

أحتاج خوارزمية فيها الدولة قليلا فقط التغييرات مرة واحدة خلال كل التكرارات;أنا.هـ أريد كل بت تتصرف مثل الطيور الحوامة المهاجرة (بت 3).

كيف يمكن أن أفعل هذا ؟

تحرير

يبدو أن معظم الناس تتقارب إلى هناك فقط 5 الحلول الممكنة.إلا أن هذا يفترض أن هناك نقطة انطلاق قيمة و نقطة النهاية.هذا لا يهم لذلك أنا ذاهب لإعطاء العالم الحقيقي السيناريو إلى شرح أفضل.

لنفترض لدي المنبه الرقمية أن يعطيني 4 المخرجات.كل الانتاج يمكن برمجتها على الذهاب في وقت معين و في وقت معين و يتم برمجتها مستقلة عن بعضها البعض ، على سبيل المثال.أستطيع إخراج البرنامج 1 الذهاب على الساعة 1 صباحا في الساعة 3 صباحا ، في حين أستطيع إخراج البرنامج 2 الذهاب على الساعة 7 مساء و في 2 صباحا.لا توجد قيود على كيفية طويلة كل الانتاج يمكن البقاء.

الآن أريد أن ربط هذا المنبه إلى الكمبيوتر للحصول في أقرب وقت ممكن الحالي في الوقت الصحيح.أنا.هـ إذا كانت الساعة يقول الوقت 2:15 pm, جهاز الكمبيوتر يعرف أن إنذار في حدود الساعة 12 ظهرا إلى 6 مساء النطاق على سبيل المثال.كنت تريد أن تكون قادرة على الحصول على أصغر نطاق ممكن.ما أصغر عدد ممكن يمكنني الحصول عليه ؟

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

المحلول

  1. هناك 4 بت.
  2. كل شيء قد تغير الدولة مرة واحدة فقط.
  3. لكل قيمة جديدة على الأقل واحدة من القطع يجب أن يكون تغيير الدولة من القيمة السابقة.

ولذلك يمكنك الحصول على الأكثر 4 الدولة التغييرات على الأكثر 5 قيم مختلفة.

على سبيل المثال:

0000 -> 0001 -> 0011 -> 0111 -> 1111

تحرير:

جيد جدا, دعونا نكرر ما يعني بدلا من ما تقوله.

  1. هناك 4 بت.
  2. كل شيء قد تغير الدولة فقط مرتين.(مرة واحدة من 0 إلى 1 مرة واحدة من 1 إلى 0)
  3. لكل قيمة جديدة على الأقل واحدة من القطع يجب أن يكون تغيير الدولة من القيمة السابقة.

ولذلك يمكنك الحصول على الأكثر 8 الدولة التغييرات على الأكثر 8 قيم مختلفة (منذ آخر تغيير الحالة بالضرورة يجمع كل القطع تعود إلى حالتها الأولى)

على سبيل المثال:

0000 -> 0001 -> 0011 -> 0111 -> 1111 -> 1110 -> 1100 -> 1000 -> 0000

وذلك من خلال تحديد نواتج:3 صباحا - 3 مساء إلى 6 صباحا - 6 مساء و 9 صباحا - 9 مساء و ظهرا - منتصف الليل, يمكنك تحديد أي 3 ساعات الفترة من النواتج.أقترح توصيل الأسلاك في visual الانتاج بدلا من ذلك.

نصائح أخرى

وأنت تريد كود رمادي . ننظر حوالي نصف الطريق أسفل ل "بناء رمز الرمادي ن بت".

وأعتقد أنه من المستحيل أن دورة على الرغم من كل أنماط قليلا محتملة مع مثل هذا التقييد.

إذا كان لديك فكرة ن بت، يمكنك التنقل على الرغم من ما مجموعه (ن + 1) تنص قبل ان تضطر الى الوجه قليلا كنت قد انقلبت بالفعل.

وعلى سبيل المثال، في مثال 3-بت، إذا كنت تبدأ مع 111، تحصل

111
110
100
000

وبعد ذلك كنت اضطر لقلب واحد كنت قد انقلبت بالفعل للحصول على ولاية جديدة.

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

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

0000 -> 0001 -> 0011 -> 0111 -> 1111   -> 1110 -> 1100 -> 1000 -> 0000

وعدد من الخطوات هو ضعف عدد البتات، وذلك مع 4 بت يمكن أن تحصل في الوقت الحالي إلى داخل نطاق 3 ساعة.

وأنت تريد كل بت لتغيير مرة واحدة فقط؟

ومثل:

0000 -> 0001 -> 0011 -> 0111 -> 1111 

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

إذا حصلت Gamecat بشكل صحيح، وقيم قناع بت هو:

 1 - 1 
 2 - 1 
 4 - 1
 8 - 1
 16 - 1
 etc.
 2^i - 1

وأو، وذلك باستخدام تحولات:  (1 << ط) - 1 لأنني في 0 ..

و"أحتاج خوارزمية حيث حالة قليلا يتغير سوى مرة واحدة خلال كل التكرار"

إذا أخذ العبارة أعلاه حرفيا، ثم هناك خمس دول فقط في التكرار، كما هو موضح في وظائف أخرى.

وإذا كان السؤال هو "كم عدد متواليات ممكن يمكن أن تتولد؟"، ثم:

هل الدولة الأولى دائما 0000؟

إذا لم يكن كذلك، ثم لديك 16 ولاية الأولية الممكنة.

هل ترتيب الأمر؟

وإذا كانت الإجابة بنعم، ثم لديك 4! = 24 السبل الممكنة لاختيار أي بت على الوجه الأول.

وهكذا، وهذا يعطي ما مجموعه 16 * 24 = 384 تسلسل المحتملة التي يمكن أن تتولد.

وإذا نظرنا إلى الوراء في السؤال الأصلي أعتقد أنني أفهم ما تعنيه

وببساطة ماذا يكون أقل قدر من البتات التي يمكن استخدامها لبرنامج على مدار الساعة، على أساس كمية من مزيج قليلا ممكنة

والسؤال الأول هو كيف يطلب العديد من متواليات.

و60Secs × 60 دقيقة س 24HRS = 86400 (مجموعات المطلوبة) الخطوة التالية هي العمل على كيفية العديد من بت المطلوبة لإنتاج ما لا يقل عن 86400 مجموعات

وإذا كان شخص ما يعرف الحساب إلى

وكيف العديد من البتات يمكن أن تنتج 86400 مجموعات ثم أن يكون جوابك. نأمل هناك صيغة على الانترنت في مكان ما لهذا الحساب

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

char bits = 0x05;
flipp_bit(char bit_flip)
{
    static char bits_flipped=0;
    if( (bits_flipped & bit_flip) == 0)
    {
        bits_flipped |= bit_flip;
        bits ^= bit_flip;
    }
}

والتقليب مع هذه الوظيفة سوف تسمح فقط الوجه واحد على كل بت.

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