result := ((a + 3) shr 2) shl 2; 这叫什么方法?查那些数学书?(100分)

  • 主题发起人 主题发起人 hsgrass
  • 开始时间 开始时间
H

hsgrass

Unregistered / Unconfirmed
GUEST, unregistred user!
function _4Multiple(const a: integer): integer;
begin
result := ((a + 3) shr 2) shl 2
// 加3然后整除2,再乘2就是4的倍数,为什么?
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a: integer;
i: integer;
begin
for i := 0 to 10 do
begin
memo1.lines.add(inttostr(_4multiple(i)))
end;
end;
 
我是这样理解的

因为只要保证一个二进制数(可将十进制数换算后看一下)最低两位为00就是4的倍数,
所以只要将一个数右移两位,再左移两位后,这个数一定是4的倍数,
但是0到3只有两位二进制位,右移两位再左移两位后,就变为0了,
所以为了保证不让0(二进制为00)到3(二进制为11)的数变为0,就统一先加上低两位最大二进制数11即十进制3,进行进位处理,这样:右移两位再左移两位后就是4的倍数了

例如:

7(二进制为111)加上3(二进制为11)变为10(二进制为1010),
右移两位后变为二进制数10,再左移两位后变为二进制数1000即十进制数8,此时二进制数1000的低两位已变成00了,所以这个数肯定是4的倍数
 
shl 2 是左移 2 位,也就是乘 4 的意思。
4 的倍数与前面的加 3,右移 2 位无关。任何整数乘 4 一定是 4 的倍数。
 
睡了一觉又有了新的理解,比较愚钝,大家不要扔西瓜皮:)
第二次理解如下
function _4Multiple(const a: integer): integer;
begin
result := ((a + 3) shr 2) shl 2;
end;
这个函数的功能是:
以传入的参数为基数,计算出一个[red]能被4整除的数[/red].
基本原理请见我上面的第一次理解,另外加3是为了保证向后进位取位,
这个函数并不是简单的求4的倍数,例如输入2,函数会返回4,而不是
乘以4(a shr 2)=8
 
恨高明的代码啊。
 
但是当a=0时,即使加上3,最后还是等于0啊.
 
to hityou
你说的对,但0一样能被任何非0自然数整除呀,同样输入4得到的还是4,输入参数值只是一个基数.
 
基本同意luzhouman的见解

加一条就是输入a求比a大并且最靠近a的且能被4整除的数。

不知可否,请指教!
 
上面写错了
((x + 3) shr 2 ) shl 2 = ((x + 3) div 4 ) * 4

这个函数的目的就是求4的倍数,使数据对齐,CPU一次读4字节

<DELPHI数据结构>里面来的.


result := ((3 + x) div 5) * 3 // 返回3的倍数
result := ((3 + x) div 5) * 5 // 返回5的倍数
result := ((3 + x) div 8) * 8 // 返回8的倍数
 
整除、模运算之中常常会用到+n的方法的,
为的就是能简洁点代码,在一个循环中对一串相对规律的数进行处理
比如说 数字 1到30的循环,当前是n,
那么下一个就应该是 (n mod 30) +1
上一个就应该是 ((n+28) mod 30) + 1
 
强劲的代码,呵呵
(x+3)&(~3)
比如,把一个数字映射到4进制数组中
 
实际上就是:result := ((a + 3) div 4) * 4;
 
恩,同意luzhouman的,这个函数是不是为了读文件啊?
 
这个函数是为了分配内存为4的倍数,使类似tlist的类效率提高
 
直接用stack不是更快么?
 
hityou:怎么使用?

這個問題,主要是想知道要学习那些资料,因为看到那个表达式,知道结果,但不知道
为什么这样写,就像看李维写的inside VCL
function TDispatcher.HashOf(const Key: string): Cardinal;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length(Key) do
Result := ((Result shl 2) or (Result shr (SizeOf(Result) * 8 - 2))) xor
Ord(Key);
end;
// 我只知道hash有多种方法计算,这是怎样计算的?
 
我也不是很明白,我们公司这边就是有人从新封装了stack,他认为用tlist处理的速度墁.
用stack可以减少不必要的内存处理.
 
多人接受答案了。
 
后退
顶部