<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Эмуляция 64-битного числа]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11611&amp;type=atom" />
	<updated>2016-05-20T10:35:37Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11611</id>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Эмуляция 64-битного числа]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=103977#p103977" />
			<content type="html"><![CDATA[<p>Здесь приведены арифметические/логические операции для 64-битного числа<br />64-битное число задается как binary64_(Название)_l и binary64_(Название)_h<br />_l и _h определяет нижние и верхние части 64-битного числа<br /></p><div class="codebox"><pre><code>
:div
rem Деление 64-битного числа
if !binary64_%2_l!==0 if !binary64_%2_h!==0 (
	Echo Division by zero
	goto :eof
)
set binary64_%3_l=0
set binary64_%3_h=0
Call :getLastBitPos %2 posB
Call :copy tmp03 %1
Call :load32 tmp04 0
for /l %%i in (63,-1,0) do (
	set /a &quot;hpos=posB + %%i&quot;
	if !hpos! lss 64 (
		Call :copy tmp01 %2
		Call :left tmp01 %%i tmp02
		Call :copy tmp01 tmp02
		Call :compare tmp03 tmp01
		set j=false
		if !stat!==E set j=true
		if !stat!==G set j=true
		if !j!==true (
			Call :load32 tmp05 1
			Call :left tmp05 %%i tmp02
			Call :copy tmp05 tmp02
			Call :add tmp05 tmp04 tmp02
			Call :copy tmp04 tmp02
			Call :copy tmp06 %2
			Call :left tmp06 %%i tmp02
			Call :copy tmp06 tmp02
			Call :not tmp03 tmp03
			Call :add tmp03 tmp06 tmp02
			Call :not tmp02 tmp02
			Call :copy tmp03 tmp02
		)
		
	)
)
Call :copy %3 tmp04
goto :eof

:sub
rem Вычитание 64-битного числа
Call :copy tmp01 %1
Call :not tmp01 tmp01
Call :add tmp01 %2 tmp02
Call :copy tmp01 tmp02
Call :copy %3 tmp02
goto :eof

:load32
set binary64_%1_h=0
set binary64_%1_l=%2
goto :eof

:compare
rem Сравнение 64-битного числа
set stat=E
set /a &quot;tmp01=(binary64_%1_l &amp; 0xFFFF) - (binary64_%2_l &amp; 0xFFFF)&quot;
set /a &quot;tmp02=((binary64_%1_l &gt;&gt; 16) &amp; 0xFFFF) - ((binary64_%2_l &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;tmp03=(binary64_%1_h &amp; 0xFFFF) - (binary64_%2_h &amp; 0xFFFF)&quot;
set /a &quot;tmp04=((binary64_%1_h &gt;&gt; 16) &amp; 0xFFFF) - ((binary64_%2_h &gt;&gt; 16) &amp; 0xFFFF)&quot;
for /l %%i in (4,-1,1) do (
	if !stat!==E (
		if !tmp0%%i! gtr 0 (set stat=G) else if !tmp0%%i! lss 0 (set stat=L)
	)
)
goto :eof

:getLastBitPos
set tmp01=0
for /l %%i in (63,-1,0) do (
	if !tmp01!==0 (
		set /a &quot;tmp02=%%i&quot;
		if !tmp02! geq 32 (
			set /a tmp02-=32
			set /a &quot;tmp03=(binary64_%1_h &gt;&gt; tmp02) &amp; 1&quot;
		) else (
			set /a &quot;tmp03=(binary64_%1_l &gt;&gt; tmp02) &amp; 1&quot;
		)
		if !tmp03!==1 (
			set tmp01=1
			set %2=%%i
		)
	)
)
goto :eof

:copy
rem Копирование 64-битного числа
set binary64_%1_h=!binary64_%2_h!
set binary64_%1_l=!binary64_%2_l!
goto :eof

:mul
rem Умножение 64-битного числа
set /a &quot;tmp01=binary64_%1_l &amp; 0xFFFF&quot;
set /a &quot;tmp02=(binary64_%1_l &gt;&gt; 16) &amp; 0xFFFF&quot;
set /a &quot;tmp03=binary64_%1_h &amp; 0xFFFF&quot;
set /a &quot;tmp04=(binary64_%1_h &gt;&gt; 16) &amp; 0xFFFF&quot;
set /a &quot;tmp05=binary64_%2_l &amp; 0xFFFF&quot;
set /a &quot;tmp06=(binary64_%2_l &gt;&gt; 16) &amp; 0xFFFF&quot;
set /a &quot;tmp07=binary64_%2_h &amp; 0xFFFF&quot;
set /a &quot;tmp08=(binary64_%2_h &gt;&gt; 16) &amp; 0xFFFF&quot;
set /a &quot;tmp09=(tmp01 * tmp05) &amp; 0xFFFF&quot;
set /a &quot;tmp10=(((tmp09 &gt;&gt; 16) &amp; 0xFFFF) + (tmp02 * tmp05)) &amp; 0xFFFF&quot;
set /a &quot;tmp11=(((tmp10 &gt;&gt; 16) &amp; 0xFFFF) + (tmp03 * tmp05)) &amp; 0xFFFF&quot;
set /a &quot;tmp12=(((tmp11 &gt;&gt; 16) &amp; 0xFFFF) + (tmp04 * tmp05)) &amp; 0xFFFF&quot;
set /a &quot;tmp13=(tmp01 * tmp06) &amp; 0xFFFF&quot;
set /a &quot;tmp14=(((tmp13 &gt;&gt; 16) &amp; 0xFFFF) + (tmp02 * tmp06)) &amp; 0xFFFF&quot;
set /a &quot;tmp15=(((tmp14 &gt;&gt; 16) &amp; 0xFFFF) + (tmp03 * tmp06)) &amp; 0xFFFF&quot;
set /a &quot;tmp17=(tmp01 * tmp07) &amp; 0xFFFF&quot;
set /a &quot;tmp18=(((tmp17 &gt;&gt; 16) &amp; 0xFFFF) + (tmp02 * tmp07)) &amp; 0xFFFF&quot;
set /a &quot;tmp21=(tmp01 * tmp08) &amp; 0xFFFF&quot;
set /a &quot;tmp25=tmp09&quot;
set /a &quot;tmp26=tmp10 + tmp13 + (((tmp01 * tmp05) &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;tmp27=tmp11 + tmp14 + tmp17 + (((tmp02 * tmp05) &gt;&gt; 16) &amp; 0xFFFF) + (((tmp01 * tmp06) &gt;&gt; 16) &amp; 0xFFFF) + ((tmp26 &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;prevBits=((tmp27 &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;highSum11=(((tmp03 * tmp05) &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;highSum14=(((tmp02 * tmp06) &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;highSum17=(((tmp01 * tmp07) &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;tmp28=tmp12 + tmp15 + tmp18 + tmp21 + prevBits + highSum11 + highSum14 + highSum17&quot;
set /a &quot;binary64_%3_l=(tmp25 &amp; 0xFFFF) | ((tmp26 &amp; 0xFFFF) &lt;&lt; 16)&quot;
set /a &quot;binary64_%3_h=(tmp27 &amp; 0xFFFF) | ((tmp28 &amp; 0xFFFF) &lt;&lt; 16)&quot;
goto :eof

:add
rem Сложение 64-битного числа
set /a &quot;tmp1=(binary64_%1_l &amp; 0xFFFF) + (binary64_%2_l &amp; 0xFFFF)&quot;
set /a &quot;tmp2=((binary64_%1_l &gt;&gt; 16) &amp; 0xFFFF) + ((binary64_%2_l &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;tmp3=(binary64_%1_h &amp; 0xFFFF) + (binary64_%2_h &amp; 0xFFFF)&quot;
set /a &quot;tmp4=((binary64_%1_h &gt;&gt; 16) &amp; 0xFFFF) + ((binary64_%2_h &gt;&gt; 16) &amp; 0xFFFF)&quot;
set /a &quot;binary64_%3_l=tmp1 + (tmp2 &lt;&lt; 16)&quot;
set /a &quot;binary64_%3_h=(((tmp1 &gt;&gt; 16) + tmp2) &gt;&gt; 16) + tmp3 + (tmp4 &lt;&lt; 16)&quot;
goto :eof

:right
rem Беззнаковый сдвиг вправо 64-битного числа
set /a diff=%2-32
if !diff! gtr 0 (
	set /a &quot;binary64_%3_h=0&quot;
	set /a &quot;binary64_%3_l=((binary64_%1_h &gt;&gt; (%2-32)) &amp; ((1&lt;&lt;(32-(%2-32)))-1))&quot;
) else (
	set /a &quot;binary64_%3_h=(binary64_%1_h &gt;&gt; %2) &amp; ((1&lt;&lt;(32-%2))-1)&quot;
	set /a &quot;binary64_%3_l=((binary64_%1_l &gt;&gt; %2) &amp; ((1&lt;&lt;(32-%2))-1))|(binary64_%1_h &lt;&lt; (32-%2))&quot;
)
goto :eof

:left
rem Сдвиг влево 64-битного числа
set /a diff=%2-32
if !diff! gtr 0 (
	set /a &quot;binary64_%3_h=(binary64_%1_l &lt;&lt; (%2-32))&quot;
) else (
	set /a &quot;binary64_%3_h=(binary64_%1_h &lt;&lt; %2) | ((binary64_%1_l &gt;&gt; (32-%2)) &amp; ((1&lt;&lt;%2)-1))&quot;
)
set /a &quot;binary64_%3_l=binary64_%1_l &lt;&lt; %2&quot;
goto :eof

:xor
rem Логическое исключающее или 64-битного числа
set /a &quot;binary64_%3_h=binary64_%1_h ^ binary64_%2_h&quot;
set /a &quot;binary64_%3_l=binary64_%1_l ^ binary64_%2_l&quot;
goto :eof

:and
rem Логическое и 64-битного числа
set /a &quot;binary64_%3_h=binary64_%1_h &amp; binary64_%2_h&quot;
set /a &quot;binary64_%3_l=binary64_%1_l &amp; binary64_%2_l&quot;
goto :eof

:or
rem Логическое или 64-битного числа
set /a &quot;binary64_%3_h=binary64_%1_h | binary64_%2_h&quot;
set /a &quot;binary64_%3_l=binary64_%1_l | binary64_%2_l&quot;
goto :eof

:not
rem Побитовая инверсия 64-битного числа
set /a &quot;binary64_%2_h=~binary64_%1_h&quot;
set /a &quot;binary64_%2_l=~binary64_%1_l&quot;
goto :eof
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[torus]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33003</uri>
			</author>
			<updated>2016-05-20T10:35:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=103977#p103977</id>
		</entry>
</feed>
