Как реализовать бинарное деление по модулю 2 в c ++ - PullRequest
0 голосов
/ 15 октября 2019

Прямо сейчас я хочу реализовать проверку циклическим избыточным кодом в c ++, поэтому я хочу знать, как я могу выполнить двоичное деление mod 2.
Хорошо, хотя я знаю, что для двоичного div mod-2 есть строковый алгоритм, но я хочузнать, есть ли какой-нибудь алгоритм int для этого. Извините за мое новичковое объяснение.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019
#include <iostream>
using namespace std;

int main(){
      int bits[100],generator[20];

      int sizebits , sizeGen ;
      cin >> sizebits >> sizeGen ;

      for(int i = 0; i < sizebits ; i++)
           cin >> bits[i];

      for(int i = 0; i < sizeGen ; i++)
          cin >> generator[i];

      for(int i = 0; i < sizebits-sizeGen;){
            for(int j = 0; j < sizeGen; j++)
                 bits[i+j] = (bits[i+j] == generator[j]? 0 : 1) ;
            for(; i < sizebits-sizeGen && bits[i] != 1 ;i++);
      }

      for(int i = 0; i < sizebits ; i++)
          cout << bits[i];

      return 0;
}

можно сделать таким образом!

0 голосов
/ 15 октября 2019

Вот пример кода для CRC, использующего двоичное деление по модулю 2):

/*
 * The width of the CRC calculation and result.
 * Modify the typedef for a 16 or 32-bit CRC standard.
 */
typedef uint8_t crc;

#define WIDTH  (8 * sizeof(crc))
#define TOPBIT (1 << (WIDTH - 1))

crc
crcSlow(uint8_t const message[], int nBytes)
{
    crc  remainder = 0; 


    /*
     * Perform modulo-2 division, a byte at a time.
     */
    for (int byte = 0; byte < nBytes; ++byte)
    {
        /*
         * Bring the next byte into the remainder.
         */
        remainder ^= (message[byte] << (WIDTH - 8));

        /*
         * Perform modulo-2 division, a bit at a time.
         */
        for (uint8_t bit = 8; bit > 0; --bit)
        {
            /*
             * Try to divide the current data bit.
             */
            if (remainder & TOPBIT)
            {
                remainder = (remainder << 1) ^ POLYNOMIAL;
            }
            else
            {
                remainder = (remainder << 1);
            }
        }
    }

    /*
     * The final remainder is the CRC result.
     */
    return (remainder);

}   /* crcSlow() */

С https://barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code.

...