使用matlab生成乙個 60位的隨機數,用2048個12位的多項式對其做除法運算,檢視其餘數的重複情況。
用足夠多的隨機數60位隨機數做第一問的除法運算,觀察總體的重複的概率分布。
第一次用matlab程式設計。
查詢了crc迴圈冗餘的資料,就跟著crc求餘數的思路。
crc方法:把12位多項式當做除數,把多項式係數變成二進位制01編碼,最高次1, 於是12位多項式相
然後,把生成的隨機數也變成二進位制,在其後面補r=(多項式長度-1)個0,
再除以多項式,二進位制除法就相當於異或計算,不進製。餘數的取最後的r位。(做到這裡就達到題目的要求了)再將隨機數的後r位用餘數替換,除以二進位制多項式,若餘數為0,則正確,不為0,錯誤。
1.十進位制轉二進位制dec2bin
轉化後的二進位制格式,要轉變成向量矩陣,才能進行矩陣合併,進而補0
oba=dec2bin(a) ;
d=;for l=1:length(oba)
d=[d str2num(oba(l))];
endd;
2.設定乙個空矩陣x,最後填充時,格式要對,還要把向量轉成十進位制
r=num2str(r)
r=bin2dec (r
1*********xx共2048個12位多項式,十進位制時2048到4095
後一位確定為1,所以都不能被2整除所以可以作為判斷條件。
[q,v]=deconv()相當於多項式除法,結果可能為負數
mod2,模2取餘法,求得餘數。
5.用二進位制計算要注意之前各種資料格式的轉化!!格式不對,會報錯。而且有時回報2^53的錯
這是crc,執行100次的概率圖
這是用十進位制直接除100次的概率圖
十進位制執行1w次的概率。
用crc演算法,matlab執行太慢,裡面有太多的for迴圈。其核心是多項式除法,即異或除法,所以和10進製除法不一樣。
附加crc**:
x=;i=0;
a=unidrnd(2^60-1)
oba=dec2bin(a) ;
d=;for l=1:length(oba)
d=[d str2num(oba(l))];
endd;
for m=2048:4095
obj=dec2bin(m) ;
c=;for j=1:length(obj)
c=[c str2num(obj(j))];
endc;
r=length(c)-1;
[q,r] = deconv([d zeros(1,r)],c);
r=mod(r(end-r+1:end),2);
r=num2str(r);
r=bin2dec®;
i=i+1;
x(i)=r;
endend
fprintf(『x=%dx』)
第二問假設用2000個隨機數分別求第乙個多項式…第2048個多項式,看哪個餘數的重複最少。即驗證2048個crc多項式哪個最優。
只用把除數的迴圈提前,再加乙個2000次迴圈就可以了。
把資料匯入excel中操作比較方便,篩選出餘數個數最多的多項式。111001010011
關於二進位制的一些總結
5 00000000 00000000 00000000 00000101 原碼 乙個整數,按照絕對值大小轉換成的二進位制數 反碼 將二進位制數按位取反,所得的新二進位制數稱為原二進位制數的反碼 補碼 反碼加1稱為補碼 5 原碼 00000000 00000000 00000000 00000101...
二進位制的一些操作
1 二進位制與十進位制互轉 十進位制轉二進位制 例子 13 1101 13 2 6餘1 6 2 3餘0 3 2 1餘1 1 2 0餘1 那麼13用二進位制表示為 1101 倒序排列餘數 不足的用0補齊 00001101 二進位制轉十進位制 例子 1101 13 可以在c 裡面宣告為 int num ...
二進位制補碼的一些思考
最近都一直在看幾本關於計算機組成原理方面的大作 code the hidden language of computer hardware and software computer system a programer perspective introduction to computer sy...