Это не имеет смысла, потому что то, что вы пытаетесь сделать, не оптимизирует полученный процесс !!!
Эй, я нигде не прочитал в вашем вопросе, что вы намеревались оптимизировать.
Electric Engg люди никогда не перестают быть любопытными независимо от «полезности».Мы как навязчивые навязчивые накопители предметов, о которых вы читаете в новостях, где они складывают свои чердаки, подвалы, спальни и гостиные с мусором, который, по их мнению, пригодится однажды.По крайней мере, так было, когда я учился в школе Энгга чуть менее 30 лет назад.Я призываю вас продолжать поиски «бесполезных» знаний, которые, по-видимому, имеют мало возможностей для оптимизации вашей жизни или образа жизни.Зачем зависеть от компилятора, если вы можете сделать это с помощью алгоритма, написанного вручную ?!Ях?Знаешь, будь немного авантюристом. Хорошо, если вы отрицаете людей, которые выражают презрение к вашему стремлению к знаниям.
Вспомните, как вас учили в средней школе, как вас учили делить?437/24, например
_____
24|437
018
-----
24|437
24
-----
197
24
-----
5
Число, которое подлежит делению, 437, называется дивидендом.24 - делитель, результат 18 - частное, а 5 - остаток. Как и в случае подачи налоговых деклараций, вам необходимо заполнить прибыль, которую вы получили от «дивидендов», что является ошибочным.То, что вы заполняете в налоговой форме, является кратным частному одного огромного куска дивидендов.Вы не получили дивиденды, но только часть дивидендов - в противном случае это означало бы, что вы владеете 100% акций.
___________
11000|110110101
000010010
-----------
11000|110110101
11000
----------
000110101 remainder=subtract divisor from dividend
11000000 shift divisor right and append 0 to quotient until
1100000 divisor is not greater than remainder.
110000 Yihaa!
----------
000101 remainder=subtract shifted divisor from remainder
11000 shift divisor right and append 0 to quotient until
1100 divisor is not greater than remainder.
----------
oops, cannot shift anymore.
Выше, как вы уже знаете, есть ИСТИННОЕ подразделение.Что достигается путем вычитания сдвинутым делителем.
То, что вы хотите, - это добиться того же, просто сместив дивиденд.К сожалению, этого нельзя сделать, если делитель не имеет экспоненциальной степени 2 (2,4,8,16).Что является очевидным фактом двоичной арифметики.Или, по крайней мере, я не знаю ни одного метода, который мог бы сделать это без аппроксимации и интраполяционных методов.
Следовательно, вы должны использовать комбинацию сдвига дивидендов и истинного деления.Например,
24 = 2 x 2 x 2 x 3
Сначала разделите 437 на 8, используя двоичное смещение, чтобы получить 010010, а затем используйте истинное деление, чтобы разделить на 3:
010010
--------
11|110110
11
-------
011
11
-----
0
, который получается до 010010 = 18.
Вуаля.
Как вы определяете 24 = 2 ^ 8 x 3?
Смещая 11000 вправо, пока не достигнете 1.
Что означает,вы можете смещать дивиденд столько раз, сколько смещаете делитель до тех пор, пока делитель не достигнет 1.
Следовательно, очевидно, что этот метод не будет работать, если делитель нечетный.например, он не будет работать для делителя 25, но он будет работать немного для делителя 50.
Может быть, существуют прогностические методы, которые могут интерполировать делитель, например 13, между 2 ^ 3 = 8 и 2^ 4 = 16.Если таковые имеются, я не знаком с ними.
Вам нужно изучить ряд чисел.Например, разделив на 25:
1 1 1 1 1
__ = __ - ___ - ___ + ___ - ... until the precision you require.
25 16 64 128 256
, где общая форма ряда равна
1 1 b1 bn
_ = ___ + _______ + ... + ______
D 2^k 2^(k+1) 2^(k+n)
, где bn равно -1, 0 или + 1.
Я надеюсь, что мои бинарные манипуляции выше не будут иметь ошибок или опечаток.Если это так, тысячи извинений.