149 lines
2.3 KiB
Plaintext
149 lines
2.3 KiB
Plaintext
class Integer < Value
|
|
|
|
int as_char()
|
|
if_plus( self - 9)
|
|
return 32
|
|
else
|
|
return 48 + self
|
|
end
|
|
end
|
|
|
|
int high_times( int by_high , int by_low)
|
|
|
|
int num_high = self >> 16
|
|
int num_low = self & 65535
|
|
|
|
int res_high = by_high * num_high
|
|
|
|
num_low = by_high * num_low
|
|
num_high = num_high * by_low
|
|
|
|
num_high = num_low + num_high
|
|
|
|
num_high = num_high >> 16
|
|
|
|
res_high = res_high + num_high
|
|
|
|
return res_high
|
|
|
|
end
|
|
|
|
int low_times( int by_high , int by_low)
|
|
|
|
int num_high = self >> 16
|
|
int num_low = self & 65535
|
|
|
|
int res_low = by_low * num_low
|
|
|
|
num_low = by_high * num_low
|
|
num_high = num_high * by_low
|
|
|
|
num_low = num_low + num_high
|
|
|
|
num_low = num_low << 16
|
|
|
|
res_low = res_low + num_low
|
|
|
|
return res_low
|
|
|
|
end
|
|
|
|
int div10()
|
|
int minus_10 = self - 10
|
|
int me = self
|
|
|
|
int tmp = me >> 2
|
|
me = me - tmp
|
|
|
|
tmp = me >> 4
|
|
me = me + tmp
|
|
|
|
tmp = me >> 8
|
|
me = me + tmp
|
|
|
|
tmp = me >> 16
|
|
me = me + tmp
|
|
me = me >> 3
|
|
|
|
int tmp2 = me << 2
|
|
tmp2 = me + tmp2
|
|
|
|
tmp2 = tmp2 << 1
|
|
|
|
if_minus(tmp2 - minus_10)
|
|
me = me + 1
|
|
end
|
|
return me
|
|
end
|
|
|
|
int div10_almost()
|
|
int me = self
|
|
if_zero( me >> 26 )
|
|
me = me + 1
|
|
end
|
|
int res_high = me.high_times( 26214 , 26215 )
|
|
int res_low = self >> 31
|
|
res_high = res_high >> 2
|
|
|
|
return res_high + res_low
|
|
|
|
end
|
|
|
|
Word as_string(Word str)
|
|
if_minus( self - 10 )
|
|
int num = as_char()
|
|
str = str.push_char( num )
|
|
else
|
|
int rest = self.div10()
|
|
str = rest.as_string( str )
|
|
rest = rest * 10
|
|
rest = self - rest
|
|
str = rest.as_string(str)
|
|
end
|
|
return str
|
|
end
|
|
|
|
Word to_s()
|
|
Word start = " "
|
|
return as_string( start )
|
|
end
|
|
|
|
int puti()
|
|
Word str = self.to_s()
|
|
str.putstring()
|
|
return self
|
|
end
|
|
|
|
int mod4()
|
|
return self & 3
|
|
end
|
|
|
|
int fibr( )
|
|
if_plus( self - 2 )
|
|
int tmp
|
|
tmp = self - 1
|
|
int a = tmp.fibr( )
|
|
tmp = self - 2
|
|
int b = tmp.fibr( )
|
|
return a + b
|
|
else
|
|
return self
|
|
end
|
|
end
|
|
|
|
int fibw( )
|
|
int result = 1
|
|
int a = 0
|
|
int b = 1
|
|
int i = 2
|
|
while_plus( self - i )
|
|
result = a + b
|
|
a = b
|
|
b = result
|
|
i = i + 1
|
|
end
|
|
return result
|
|
end
|
|
|
|
end
|