A. 計算機網路的一個習題求解,解答看不懂,題目和解答如下!關於首部檢驗和的計算。
首部檢驗的方法是,吧首部分成一些16字的序列,將首部檢驗置0,然後對這些序列進行反碼算數運算。求出來的這個和的反碼放入首部檢驗位(16位)。收到數據報時進行檢驗:就是把首部再反碼求和一遍,然後再取反碼,這時應該得到0。
所以說前五行就是首部的前五行。
然後接下來的五行就是,換算成2進制的序列。
將這些序列16位的取反碼合(包括和檢驗欄位)得出來首部檢驗和發送前的值。
0111010001001110
然後再取反碼放入首部檢驗位
1000101110110001
沒有算,不過算出來應該就是這樣。
反碼求和時最高位相加產生進位的話結果要+1.
B. 首部檢驗和怎麼計算
IP首部校驗和的計算方法:
把校驗和欄位清零,對每16位(2位元組)進行二進制反碼求和, 反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。
IP數據報校驗只對首部進行校驗,不對數據部分進行校驗。把首部看成16位為單位的數字組成,依次進行二進制反碼求和,再把結果依次存入校驗和欄位中即可。
(2)計算機網路反碼求和例題擴展閱讀:
將發送的進行檢驗和運算的數據分成若干個16位的位串,每個位串看成一個二進制數,這里並不管字元串代表什麼,是整數、浮點數還是點陣圖都無所謂。將IP、UDP或TCP的PDU首部中的檢驗和欄位置為0,該欄位也參與檢驗和運算。
對這些16位的二進制數進行1的補碼和(one's complement sum)運算,累加的結果再取反碼即生成了檢驗碼。將檢驗碼放入檢驗和欄位中。
其中1的補碼和運算,即帶循環進位(end round carry)的加法,最高位有進位應循環進到最低位。反碼即二進制各位取反,如0111的反碼為1000。
C. 原碼反碼補碼計算例題
1)2)3)題因為沒有說是幾位的所以,沒辦法寫
4)0101001
5)1010010
5)11111011,01011001,11001000
2.不懂
D. 計算機,求反碼和原碼,詳細過程
引入原碼
反碼
和補碼的目的就是為了解決減法問題,因為計算機cpu的運算器中只有加法器,要把減法轉化成加法來計算。
舉個例子,a表示十進制數「+16」,b表示十進制數「-19」,把這兩個數的原碼直接相加,得:
a=+16
(a)原=00010000
b=-19
(b)原=10010011
00010000
+
10010011
————
10100011
其結果符號位為1是負數,其數值位為100011,即等於十進制數「-35」,這顯然是錯的結果。
再比如,十進制數「+16」與「+19」的原碼直接相減,得:
00010000
-
00010011
————
11111101
結果為「-125」,這又是錯的。
但是引入補碼後,加減法都可以用加法來實現,如「-16+11」的運算:
11110000
+
-16的補碼
00001011
11的補碼
————
11111011
-5的補碼
如果是「-16-11」,那麼就轉化為加法運算「-16+(-11)」
11110000
+
-16的補碼
11110101
-11的補碼
————
111100101
-27的補碼
在字長為8位的系統中,最高位所產生的進位被自然丟棄,運算結果的機器數為11100101,是-27的補碼形式,結果正確。
順便告訴你一些其它的東西:
1.二進制數中,兩數的補碼之和等於兩數和的補碼。
2.補碼=反碼+1
3.反碼=原碼除符號位外其它數值取反(即該數的絕對值取反),即「0」變「1」,「1」變「0」。
4.任何正數的原碼
反碼
補碼的形式完全相同(即都是自身,不變)
5.在計算機中,有符號的數都是採用補碼來表示的。
6.計算的時候,符號位也參與運算。
E. 二進制反碼運算是怎麼計算的
兩個數進行二進制反碼求和的運算,它的規則是從低位到高位逐列進行計算。0和0相加是0但要產生一個進位1,0和1相加是1,1和1相加是0。若最高位相加後產生進位,則最後得到的結果要加1。
舉例:已知X = + 1101 , Y = + 0110 , 用反碼計算Z = X-Y。
[X]反 = 01101
[-Y]反 = 11001
則[Z]反 =[X]反+[-Y]反 = 01101+11001+1(循環進位)= 00111
其真值為Z = +0111
(5)計算機網路反碼求和例題擴展閱讀:
運算注意事項
1、反碼的符號位相加後,如果有進位出現,則要把它送回到最低位去相加(循環進位)。
2、反碼運算時,其符號位與數值一起參加運算。
3、用反碼運算,其運算結果亦為反碼。在轉換為真值時,若符號位為0,數位不變;若符號位為1,應將結果求反才是其真值。
F. 二進制反碼求和是怎樣求的
演算法實現:
unsigned short ip_fast_csum(unsigned char * iph,
unsigned int ihl)
{
unsigned int sum;
__asm__ __volatile__(
"movl (%1), %0 ; "
"subl , %2 ; "
"jbe 2f ; "
"addl 4(%1), %0 ; "
"adcl 8(%1), %0 ; "
"adcl 12(%1), %0 ; "
"1: adcl 16(%1), %0 ; "
"lea 4(%1), %1 ; "
"decl %2 ; "
"jne 1b ; "
"adcl , %0 ; "
"movl %0, %2 ; "
"shrl , %0 ; "
"addw %w2, %w0 ; "
"adcl , %0 ; "
"notl %0 ; "
"2: ; "
: "=r" (sum), "=r" (iph), "=r" (ihl)
: "1" (iph), "2" (ihl)
: "memory");
return(sum);
}
(6)計算機網路反碼求和例題擴展閱讀
二進制反碼求和工作原理 :
0和0相加是0,但要產生一個進位1,0和1相加是1,1和1相加是0.若最高位相加後產生進位,則最後得到的結果要加1。
(0)反 + (0)反 = 1 + 1 = 10
(1)反 +(0)反=0+ 1 =1
(1)反 + (1)反 = 0 + 0 = 0
G. 二進制反碼求和運算
加數不需要取反,直接按0和0為0,0和1為1,1和1為0並向前進1,最後將最高位後的額外進位加到前面所得的部分和中,結果就是二進制反碼求和
H. 計算機原碼反碼補碼的兩道題
正數的反碼和補碼都與原碼相同,負數的反碼為對該數的原碼除符號位外各位取反,負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1,由上可知1、110101的原碼反碼和補碼都是00110101,-101101的原碼是10101101,反碼是11010010,補碼是11010011,2、x=-127D是指十進制的-127轉換成二進制原碼為11111111,反碼為10000000,補碼為10000001
I. 反碼算術運算求和
不是,是把裡面的數據按照16位依次取出,然後按照反碼算數運算求和,也就跟正常加法一樣,只不過如果最高位有進位則最終結果要加一,然後再求其反碼即可
J. 原碼,反碼和補碼三碼的計算.最好給下例題.謝謝
正(整)數按自然表示,負數以補碼表示,正數按位取反再加1得它的補碼,同理,負數也可以這樣運算得到它的正數表示。
實際上這個方法是以1000 0000(以8位為例)為分割正負數的界線,故而可以說沒有符號位。
44)d=0010 1100,
0010 1100按位取反,
得1101 0011,
再加1,得到:
11010100,
此即(-44)d。