#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 ++代码一无所知。任何人都可以解释这个方法在最后两行中做了什么吗?
由于
答案 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 ,但表示为位掩码而不是整数值)。