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
    minus_10 =  tmp2 - minus_10

    if_minus(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
end