位操作 - 解释以下C++方法

bit manipulation - Explain the following C++ method

本文关键字:C++ 方法 解释 位操作      更新时间:2023-10-16
#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 行的作用吗?

谢谢

最后两行是位移位的。

面具正在0x80并将其(x 移动到 8 的 mod(位置,例如 5>> 2 会给你 1。

x>> 3 正如它所说,

将其除以 8,取 x 并将所有位向右移动 3 个位置(因此是 1,2,4(,结果,8 将变为 1 等。 它有点像整数div,但会更快(正如注释所说,快速除以 8(

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

值 x 被屏蔽,以便只剩下较低的三位。值0x80按剩余数字向右移动。结果将分配给掩码指向的值。

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

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

>>是右移运算符。

例如,8> 3 会给你 1,右移二进制值 8 x 3 位

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

在C++中,就像大多数编程语言一样,您只能返回一个值。要"返回"两个值,常见的 C/C++ 做法是返回一个值并将指针传递给一个对象并通过指针修改该对象(在本例中mask(。

mask指向的对象将被分配一个正好设置了一个位的位掩码。这是通过将十六进制值0x80(二进制形式的 1000 0000(并将其右移 0 到 7 步来完成的。确切的步骤数由x决定,这是使用某些特定于应用程序的逻辑的计算机。

返回的值是x / 8

您可以将例程视为返回 x/8 和余数的除法例程(如 x 模 8,但表示为位掩码而不是整数值(。