>>
is bithift. Каждый бит вы сдвиг вправо, фактически делит число 2.
Поэтому (length >> 3)
является length/8
(округление вниз), и (length >> 6)
является length/64
.
Возьмите (length/8)+(length/64)
приблизительно length*(1/8+1/64)
= length*0.140625
(приблизительно)
1/7 = 0.142857...
+1
в конце может быть разделен на +0.5
для каждого термина, так что length/8
округляется до ближайшего (а не вниз), и length/64
также округляется до ближайшего.
В общем, вы можете легко приблизительная 1/y
, где y = 2^n+-1
с аналогичным приближению бит сдвига.
Бесконечная геометрическая прогрессия является:
1 + x + x^2 + x^3 + ... = 1/(1 - x)
Умножив х:
x + x^2 + x^3 + ... = x/(1 - x)
И подставляя x = 1/2^n
1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n)/(1 - 1/2^n)
1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n)/((2^n - 1)/2^n)
1/2^n + 1/2^2n + 1/2^3n + ... = 1/(2^n - 1)
Это приближает y = 2^n - 1
.
Чтобы приблизиться, y = 2^n + 1
, вместо этого заменить x = -1/2^n
.
- 1/2^n + 1/2^2n - 1/2^3n + ... = (-1/2^n)/(1 + 1/2^n)
1/2^n - 1/2^2n + 1/2^3n - ... = (1/2^n)/((2^n + 1)/2^n)
1/2^n - 1/2^2n + 1/2^3n - ... = 1/(2^n + 1)
Затем просто обрезайте бесконечную серию с требуемой точностью.
Какое подразделение имеет право смещение на 3 эквивалента? –