parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

не работает это :)

Misha v.3 11.02.2005 16:35 / 11.02.2005 17:07

как оказалось у парсера с double не работают битовые операции, сдвиговые операции, деление нацело и получение остатка от деления.

вот какие придумались варианты (в комментариях время выполнения и сожраная память):
###########################################################################
# 5000 итераций: out of memory
# 3000 итераций: time = 1061.96, memory_kb = 15808
@intToIp1[num][d;d1;d2;d3]
$d(^num.double[])
$d1(^math:floor($d / 0x1000000))
^d.dec($d1 * 0x1000000)
$d2(^math:floor($d / 0x10000))
^d.dec($d2 << 16)
$d3(^math:floor($d / 0x100))
^d.dec($d3 << 8)
$result[${d1}.${d2}.${d3}.^d.format[%d]]
#end @intToIp[]



###########################################################################
# 5000 итераций: out of memory
# 3000 итераций: time = 1288.62, memory_kb = 19464
@intToIp2[num][d;d1]
$d[^num.format[%08x]]
$result[$d1[0x^d.left(2)]^eval($d1).$d1[0x^d.mid(2;2)]^eval($d1).$d1[0x^d.mid(4;2)]^eval($d1).$d1[0x^d.right(2)]^eval($d1)]
#end @intToIp[]



###########################################################################
# 5000 итераций: time = 1240.1, memory_kb = 15576
# 3000 итераций: time = 736.207, memory_kb = 9332
@intToIp3[num][d;d1;d2;d3]
$d(^num.double[])
$d4($d % 0x100)
$d3((($d - $d4) % 0x10000) >> 8)
$d2((($d - $d4 - $d3) % 0x1000000) >> 16)
$d1(^math:floor(($d - $d4 - $d3 - $d2) / 0x1000000))
$result[${d1}.${d2}.${d3}.$d4]
#end @intToIp[]




###########################################################################
# 5000 итераций: time = 1190.26, memory_kb = 15660
# 3000 итераций: time = 703.762, memory_kb = 9376
@intToIp4[num][d;dd;d1;d2;d3;d4]
$d(^num.double[])
$d1(^math:floor($d / 0x1000000))
$dd($d % 0x1000000)
$d2(($dd >> 16) & 0xFF)
$d3(($dd >> 8) & 0xFF)
$d4(($dd) & 0xFF)
$result[${d1}.${d2}.${d3}.$d4]
#end @intToIp[]


###########################################################################
@main[]
$ints[^table::create{num
4278058235
3583543172
}]

^ints.menu{
	$ints.num = ^intToIp[$ints.num]
}[<br />]


<hr />

^run_time{
	^for[i](0;5000){^ints.menu{$tmp[^intToIp[$ints.num]]}}
}[v]
time = $v.time, memory_kb = $v.memory_kb
т.е. варианты 3 и 4 примерно одинаковые по скорости/памяти