解释以下C ++方法

时间:2011-04-06 06:54:54

标签: c++ bit-manipulation

#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 ++代码一无所知。任何人都可以解释这个方法在最后两行中做了什么吗?

由于

4 个答案:

答案 0 :(得分:2)

最后两行是位移。

掩码取0x80并将其移位(x到8的mod)位置,例如5>&gt; 2会给你1。

x&gt;&gt; 3就像它说的那样,除以8,它取x并将所有位3位移到右边(这样1,2,4),结果,8将变为1等等它有点像整数div ,但会更快(正如评论所说,快速除以8)

答案 1 :(得分:2)

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

屏蔽值x,以便仅保留低三位。值0x80向右移动剩余的数字。结果将分配给掩码指向的值。

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

x除以8。结果是该方法的reutrn值。

答案 2 :(得分:2)

>>是右移操作员。

对于例如8&gt; 3将给你1,右移二进制值8乘3位

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

答案 3 :(得分:1)

在C ++中,就像大多数编程语言一样,您只能返回一个值。要“返回”两个值,通常的C / C ++实践是返回一个并传递指向对象的指针并通过指针修改该对象(在这种情况下为mask)。

mask指向的对象将被分配一个只有一位设置的位掩码。这样做是以十六进制值0x80(二进制形式为1000 0000)并将其右移0到7步。确切的步数由x决定,x / 8是计算机使用某些特定于应用程序的逻辑。

返回的值是x/8

你可以看到例程作为一个除法例程返回{{1}}和余数(如 x modulo 8 ,但表示为位掩码而不是整数值)。