回覆列表
-
1 # iyhok12280
-
2 # 老生談笑
c語言中數字右移1位相當於除以2(整除)因為2的8次方=256,除以256取餘相當於取後8位c語言中數字先右移24位再除以256取餘 相當於取這個數的25-32位假若這個數是32位的IP地址(192.168.1.1),相當於取IP地址中最最前面的一個數(192)
c語言中數字右移1位相當於除以2(整除)因為2的8次方=256,除以256取餘相當於取後8位c語言中數字先右移24位再除以256取餘 相當於取這個數的25-32位假若這個數是32位的IP地址(192.168.1.1),相當於取IP地址中最最前面的一個數(192)
求餘和求模操作,在C語言中實際上是同一個操作,即模除運算,符號為%.a%b其含義為:求a除以b所得餘數。在C語言中,可以使用整型模除和除法配合,來獲取兩位數的個位和十位。其原理為如下。對於兩位數x,如果其個位數為b,十位數為a,(0<=a,b<=9)寫成ab的形式,其真值為10a+b。於是求x的個位數的表示式可以寫成x%10,是因為x%10=(10a+b)%10=10a%10+b%10=0+b=b這裡用到了模除相關知識。對於10a,一定是a的倍數,所以,10a對10取餘一定為0。而b為0到9的數字,比10小,對10取餘時值為本身。x/10=(10a+b)/10=10a/10+b/10=a+0=a這裡用到的是整型除法的知識。10a/10=a和b/10=0其中,b<10,對於整型,除法結果只取整數部分,於是b/10=0.透過以上推理,可以得到,對於10進位制二進位制數x,x/10為十位數,而x%10為個位數。至於提問中的賦定時初值,這個沒有要求一定用模除或除法。但有時會要求分段做初始化。比較常見的有兩種。1系統為提高效率,或其他的原因,對定時器介面做了分別的封裝,而使其適用於不同量級的定時。比如分別封裝為毫秒級別的和秒級別的。這樣對於一個超過一秒且帶有毫秒數的定時,就需要分化為秒級和毫秒級兩部分。比如2500毫秒,就需要分化成2秒+500毫秒的形式。基於兩位數取各個位的同樣原理,對於時間x,可以得到計算秒的表示式為x/1000,同時計算毫秒的表示式為x%1000。2系統對定時器的設定為暫存器形式,分為高位和低位。以雙位元組16位暫存器為例,對於時間x,可以寫成高位為x/256,和低位為x%256的格式。事實上,這種寫法是低效的,C語言提供的更高效的位操作同樣可以實現該目的,即低位為x&0xFF,高位為((unsignedshort)x>>8)&0xFF。由於本項操作與提問關係不大,所以不對其原理進行介紹了。