2011-04-06 75 views
1
#define XL  33   
#define OR  113   
#define NOR  313  
#define TN  344 

int to_bits(int critn,char *mask) 
{ 
     unsigned int x; 
     int begin; 

     if (critn < XL)   begin = 1; 
     else if (critn < OR)  begin = XL; 
     else if (critn < NOR)  begin = OR; 
     else if (critn <= TN) begin = NOR; 
     else      begin = 0; 
     x = critn - begin; 

     *mask = (char)(0x80 >> (x % 8)); 

     return (int)(x >> 3); // fast divide by 8 
} 

我對C++代碼沒有任何認識。任何人都可以解釋這種方法在最後2行中的作用嗎?請解釋以下C++方法

謝謝

+1

[這個問題](http://stackoverflow.com/questions/141525/)(和答案)可能會有所幫助。 – 2011-04-06 06:57:51

+0

如何定義'DXLO','ORLO'和'NORLO'? – 2011-04-06 07:01:22

+3

我知道這不是你的代碼,但任何半面體編譯器都會將'x/8'優化爲'x >> 3'。不需要讓事情變得更加模糊。 – 2011-04-06 07:05:17

回答

1

在C++轉移的8個二進制值,就像大多數編程語言,你可以只返回一個值。爲了「返回」兩個值,這是一種常見的C/C++實踐,即返回一個值並將指針傳遞給對象並通過指針修改該對象(在這種情況下爲mask)。

mask指向的對象將被分配一個剛剛設置了一個位的位掩碼。這是通過十六進制值0x80(二進制形式1000 0000)並右移0到7步來完成的。確切的步數由x決定,這是計算機使用某些特定於應用程序的邏輯。

返回的值是x/8

可以看到程序作爲一個返回x/8除法例程,其餘(如X模8,但表示爲位屏蔽,而不是一個整數值)。

+0

謝謝,但你可以舉個例子。如果critn = 63那麼x = 63-33 = 30.那麼面具的價值是多少? – JavaBits 2011-04-06 10:08:08

+0

As * 30模8 *爲6,操作是(以二進制表示)'10000000 >> 6'導致'00000010'。返回的值將是「30/8」或「3」。 – Lindydancer 2011-04-06 10:12:07

+0

所以會是00000010(正如你所提到的)或11111110.正如在下面的鏈接http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting它說,算術右移>>)會這樣做。我感到困惑。感謝你的幫助。 – JavaBits 2011-04-06 10:18:55

2

最後兩行是位移。

掩模正在0x80的和換擋它(x到8的MOD)的位置,例如5 >> 2會給你1.

X >> 3是因爲它說,除以8它,它取x並將所有位向右移動3個位置(因此1,2,4),結果8將變成1等等,它有點像整數div,但會更快(正如評註所言,快速劃分由8)

+1

* x到8 *的mod這對我來說是新的。我總是使用* x模8 *。 – 2011-04-06 07:02:38

+1

然而,「更快」除以8是過早優化的一個不錯的例子 - 編譯器會找出最快的方式除以8,你不應該這樣做。 – 2011-04-06 07:03:51

+0

@ adam_0也許這只是他們正在做的事情的一個不好的描述,但我想簡而言之,它確實實現了同樣的目的。我知道人們可能會遇到類似這樣的情況,其中/ 2/4/8人的想法會沿着位移的更快的方向被告知,並且即使其不是真的真的 – BugFinder 2011-04-06 07:07:27

2
*mask = (char)(0x80 >> (x % 8)); 

值x被屏蔽,所以只剩下較低的三位。值0x80被剩下的數字向右移動。結果被分配到掩碼指向的值。

return (int)(x >> 3); // fast divide by 8  

x除以8。結果是該方法的重組值。

2

>>是右移運算符。

爲e.g 8> 3會給你1,右3位

1000(binary of 8) right shift by 3 places = 0001 (1 in decimal) 
+0

謝謝你的回答 – JavaBits 2011-04-06 07:11:14