2011-04-06 77 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