计算机语言mod(m n),关于一段地址对齐的位运算代码的解释
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //為了滿足需要內(nèi)存對齊的系統(tǒng)
這段代碼有些難以理解。那么慢慢分析下吧。
假設(shè)有一個地址n,要把n按m對齊,無非就是找到大于等于n且整除m的最小的那個數(shù)。
我們定義一個宏函數(shù)F,它計算n按m對齊的結(jié)果,則按照上段代碼的邏輯,F定義為:
#define F(n, m) (n+m-1)&~(m-1)
這段代碼如果不用這種按位與來寫,其實可以這么寫:
#define F(n, m) (n+m-1)/m*m
以上的做法正確性可以分情況證明:
(為了說明問題方便,由于計算機里的除法和嚴格的數(shù)學(xué)意義上的除法是不一樣的,我們這里以"/"表示計算機里的除法,"%"表示嚴格的數(shù)學(xué)除法,"mod"表示取模運算。之后也遵循這個慣例,只是代碼還是遵循計算機語言本身的規(guī)范。)
1.如果n是能整除m的,那么結(jié)果應(yīng)該就是n,能得出F(n, m)的結(jié)果正確;
2.如果n不能整除m,那么結(jié)果應(yīng)該是n?- n mod m +?m。由于n?- n mod m +?m能整除m,所以我們只需要證(n?- n mod m +?m)/m等于(n+m-1)/m。也即證
0<= (n+m-1) -?(n?- n mod m +?m) < m
上面這個式子很顯然。
當我們反過來再看計算機里的除法"/"時,發(fā)現(xiàn),實際上,對于被除數(shù)x與除數(shù)y,有:
x/y = (x - x mod y) % y
設(shè)a=n+m-1,有
(n+m-1)/m*m = a/m*m = (a - a mod m)%m*m = a - a mod m
實際上,只要證
a&~(m-1) = a - a mod m
當然,這里的前提是,m是2的冪次。
這里假設(shè)m=2^q。那么m的二進制表示一定是1后面跟q個0。m-1則為最后面q位為1,前面全為0,按位取反結(jié)果是后面q位為0,前面為1。
由于m是2的冪次,故a mod m結(jié)果就是a的二進制表示的最后q位結(jié)果。而a按位與一個前面全為1后q位為0的二進制數(shù),則正好就是減去了后q位,等同于減去a對m的余數(shù)。
故得證。
原文:http://www.cnblogs.com/waytofall/p/4109514.html
總結(jié)
以上是生活随笔為你收集整理的计算机语言mod(m n),关于一段地址对齐的位运算代码的解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在计算机系统中使用防病毒软件的作用,防病
- 下一篇: 2017报计算机热不热,2017年五月份