#include "stdio.h" long DT=0x34EC, DX=0x1B;// DT :対象データ, DX :生成多項式(11011) int initBit(int DT){//チェック用ビットの設定 int i; for(i=1; DT!=0; DT>>=1, i<<=1); return i>>1; } int countBit(int DT){//先頭ビット位置のカウント int j; for(j=0; DT!=0;j++, DT>>=1); return j; } void bitPrint(int DT, int initB){//ビットをそのまま表示 for(long X=initB; X!=0; X>>=1){ if(DT & X) printf("1"); else printf("0"); } } void divBitPrint(int DT, int N, long initB){ for(long X=initB; X!=0; X>>=1){//先頭0サプレス if(DT & X) { for(int i=0;i>=1)//Nビット表示 if(DT & X) printf("1"); else printf("0"); return; } printf(" "); } } int CRC_DIV(long DT, long DX){ long X=initBit(DT), initB=X; //ビット・チェック用変数 int N=countBit(DX), shift=countBit(initB)-N;//シフト量等の決定 DX = DX << shift; printf("\n 入力:"); bitPrint(DT, initB); for(int i=0;i>=1){ printf("\n 除数:"); divBitPrint(DX,N,initB); if(DT & X) DT = DT ^ DX;//ビット位置が1のとき排他的論理和 printf("\n 結果:"); bitPrint(DT,initB); DX>>=1;//除数を 1 ビット右シフト } return (int) DT; } int main(int argc, char * argv[]) { int CRC; CRC=CRC_DIV(DT, DX); printf("\n\n 確認CRC= 0x%01X \n", CRC); getchar(); CRC=CRC_DIV(DT ^ CRC,DX); printf("\n\n 確認CRC= 0x%01X \n", CRC); getchar(); return 0; }