كيفية تنفيذ سجل تحويل الملاحظات الخطية 128 بت مع صفيف عنصر البايت في ج

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

  •  27-10-2019
  •  | 
  •  

سؤال

لدي صفيف على النحو التالي,

unsigned char A[16]

أنا باستخدام هذه المصفوفة لتمثيل سجل الأجهزة 128 بت.الآن أريد تنفيذ سجل التحول ردود الفعل الخطية (لفسر ، تنفيذ فيبوناتشي) باستخدام هذا السجل الطويل.كثيرات الحدود (أو الصنبور) التي تتصل بوابة شينور ردود الفعل من هذا لفسر هي [128, 29, 27, 2, 1].

تنفيذ لفسر 16 بت (الصنابير في [16, 14, 13, 11]) يمكن الحصول عليها من ويكيبيديا على النحو التالي.

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned rand()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }

ومع ذلك ، في حالتي ، أحتاج إلى تحويل البتات من عنصر بايت إلى آخر ، على سبيل المثال.مسب أو أ [0] تحتاج إلى التحول إلى لسب من أ1.ما هو الحد الأدنى من الترميز للقيام بهذا التحول?شكرا لك!

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

المحلول

لحساب بت لتحويل في لا تحتاج إلى تحويل مجموعة كاملة في كل مرة منذ كنت مهتما فقط في بت واحد (لاحظ & 1 في نهاية bit = خط من ويكيبيديا).

مبالغ التحول الصحيحة هي:

128 - 128 =   0   => byte  0 bit 0
128 -  29 =  99   => byte 12 bit 3
128 -  27 = 101   => byte 12 bit 5
128 -   2 = 126   => byte 15 bit 6
128 -   1 = 127   => byte 15 bit 7

لذا,

bit = ((A[0] >> 0) 
    ^  (A[12] >> 3) 
    ^  (A[12] >> 5) 
    ^  (A[15] >> 6) 
    ^  (A[15) >> 7)) & 1;

الآن ، كنت حقا بحاجة إلى التحول في بت:

A[0] = (A[0] >> 1) | (A[1] << 7);
A[1] = (A[1] >> 1) | (A[2] << 7);
// and so on, until
A[14] = (A[14] >> 1) | (A[15] << 7);
A[15] = (A[15] >> 1) | (bit << 7);

يمكنك جعل هذا أكثر كفاءة قليلا باستخدام uint32_t أو uint64_t بدلا من الأحرف غير الموقعة (اعتمادا على حجم كلمة المعالج) ، ولكن المبدأ هو نفسه.

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