aliases: Fixnum, Bignum
dynamic include: JSON::Generator::GeneratorMethods::Integer (by json)
要約
整数クラスです。
整数オブジェクトに特異メソッドを追加する事はできません。追加した場合、 TypeError が発生します。
2.4.0 から Fixnum, Bignum は Integerに統合されました。 2.4.0 からはどちらも Integer クラスのエイリアスとなっています。
目次
- 特異メソッド
- インスタンスメソッド
-
- %
- &
- *
- **
- +
- -
- -@
- /
- <
- <<
- <=
- <=>
- ==
- ===
- >
- >=
- >>
- []
- ^
- |
- ~
- abs
- allbits?
- anybits?
- bit_length
- ceil
- chr
- denominator
- digits
- div
- divmod
- downto
- even?
- fdiv
- floor
- gcd
- gcdlcm
- inspect
- integer?
- lcm
- magnitude
- modulo
- next
- nobits?
- numerator
- odd?
- ord
- pow
- pred
- rationalize
- remainder
- round
- size
- succ
- times
- to_f
- to_i
- to_int
- to_r
- to_s
- truncate
- upto
継承しているメソッド
- Numericから継承しているメソッド
- Comparableから継承しているメソッド
特異メソッド
sqrt(n) -> Integer
[permalink][rdoc][edit]-
非負整数 n の整数の平方根を返します。すなわち n の平方根以下の最大の非負整数を返します。
- [PARAM] n:
- 非負整数。Integer ではない場合は、最初に Integer に変換されます。
- [EXCEPTION] Math::DomainError:
- n が負の整数の時に発生します。
Integer.sqrt(0) # => 0 Integer.sqrt(1) # => 1 Integer.sqrt(24) # => 4 Integer.sqrt(25) # => 5 Integer.sqrt(10**400) == 10**200 # => true
Math.sqrt(n).floor と同等ですが、後者は浮動小数点数の精度の限界によって真の値とは違う結果になることがあります。
Integer.sqrt(10**46) #=> 100000000000000000000000 Math.sqrt(10**46).floor #=> 99999999999999991611392 (!)
[SEE_ALSO] Math.sqrt
インスタンスメソッド
self % other -> Numeric
[permalink][rdoc][edit]modulo(other) -> Numeric
-
算術演算子。剰余を計算します。
例:
# 剰余 13 % 4 # => 1 13 % -4 # => -3 -13 % 4 # => 3 -13 % -4 # => -1
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
self & other -> Integer
[permalink][rdoc][edit]-
ビット二項演算子。論理積を計算します。
- [PARAM] other:
- 数値
例:
1 & 1 # => 1 2 & 3 # => 2
self * other -> Numeric
[permalink][rdoc][edit]-
算術演算子。積を計算します。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
例:
# 積 2 * 3 # => 6
self ** other -> Numeric
[permalink][rdoc][edit]pow(other) -> Numeric
pow(other, modulo) -> Integer
-
算術演算子。冪(べき乗)を計算します。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [PARAM] modulo:
- 指定すると、計算途中に巨大な値を生成せずに (self**other) % modulo と同じ結果を返します。
- [RETURN]
- 計算結果
- [EXCEPTION] TypeError:
- 2引数 pow で Integer 以外を指定した場合に発生します。
- [EXCEPTION] RangeError:
- 2引数 pow で other に負の数を指定した場合に発生します。
例:
2 ** 3 # => 8 2 ** 0 # => 1 0 ** 0 # => 1 3.pow(3, 8) # => 3 3.pow(3, -8) # => -5 3.pow(2, -2) # => -1 -3.pow(3, 8) # => 5 -3.pow(3, -8) # => -3 5.pow(2, -8) # => -7
[SEE_ALSO] BigDecimal#power
self + other -> Numeric
[permalink][rdoc][edit]-
算術演算子。和を計算します。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
例:
# 和 3 + 4 # => 7
self - other -> Numeric
[permalink][rdoc][edit]-
算術演算子。差を計算します。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
例:
# 差 4 - 1 #=> 3
- self -> Integer
[permalink][rdoc][edit]-
単項演算子の - です。 self の符号を反転させたものを返します。
例:
- 10 # => -10 - -10 # => 10
self / other -> Numeric
[permalink][rdoc][edit]-
除算の算術演算子。
other が Integer の場合、整商(整数の商)を Integer で返します。普通の商(剰余を考えない商)を越えない最大の整数をもって整商とします。
other が Float、Rational、Complex の場合、普通の商を other と同じクラスのインスタンスで返します。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
7 / 2 # => 3 7 / -2 # => -4 7 / 2.0 # => 3.5 7 / Rational(2, 1) # => (7/2) 7 / Complex(2, 0) # => ((7/2)+0i) begin 2 / 0 rescue => e e # => #<ZeroDivisionError: divided by 0> end
[SEE_ALSO] Integer#div, Integer#fdiv, Numeric#quo
self < other -> bool
[permalink][rdoc][edit]-
比較演算子。数値として小さいか判定します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- self よりも other が大きい場合 true を返します。そうでなければ false を返します。
例:
1 < 1 # => false 1 < 2 # => true
self << bits -> Integer
[permalink][rdoc][edit]-
シフト演算子。bits だけビットを左にシフトします。
- [PARAM] bits:
- シフトさせるビット数
例:
printf("%#b\n", 0b0101 << 1) # => 0b1010 p -1 << 1 # => -2
self <= other -> bool
[permalink][rdoc][edit]-
比較演算子。数値として等しいまたは小さいか判定します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- self よりも other の方が大きい場合か、両者が等しい場合 true を返します。そうでなければ false を返します。
例:
1 <= 0 # => false 1 <= 1 # => true 1 <= 2 # => true
self <=> other -> -1 | 0 | 1 | nil
[permalink][rdoc][edit]-
self と other を比較して、self が大きい時に1、等しい時に 0、小さい時に-1、比較できない時に nil を返します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- -1 か 0 か 1 か nil のいずれか
1 <=> 2 # => -1 1 <=> 1 # => 0 2 <=> 1 # => 1 2 <=> '' # => nil
self == other -> bool
[permalink][rdoc][edit]self === other -> bool
-
比較演算子。数値として等しいか判定します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- self と other が等しい場合 true を返します。そうでなければ false を返します。
例:
1 == 2 # => false 1 == 1.0 # => true
self > other -> bool
[permalink][rdoc][edit]-
比較演算子。数値として大きいか判定します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- self よりも other の方が小さい場合 true を返します。そうでなければ false を返します。
例:
1 > 0 # => true 1 > 1 # => false
self >= other -> bool
[permalink][rdoc][edit]-
比較演算子。数値として等しいまたは大きいか判定します。
- [PARAM] other:
- 比較対象の数値
- [RETURN]
- self よりも other の方が小さい場合か、両者が等しい場合 true を返します。そうでなければ false を返します。
例:
1 >= 0 # => true 1 >= 1 # => true 1 >= 2 # => false
self >> bits -> Integer
[permalink][rdoc][edit]-
シフト演算子。bits だけビットを右にシフトします。
右シフトは、符号ビット(最上位ビット(MSB))が保持されます。 bitsが実数の場合、小数点以下を切り捨てた値でシフトします。
- [PARAM] bits:
- シフトさせるビット数
例:
printf("%#b\n", 0b0101 >> 1) # => 0b10 p -1 >> 1 # => -1
self[nth] -> Integer
[permalink][rdoc][edit]-
nth 番目のビット(最下位ビット(LSB)が 0 番目)が立っている時 1 を、そうでなければ 0 を返します。
- [PARAM] nth:
- 何ビット目を指すかの数値
- [RETURN]
- 1 か 0
a = 0b11001100101010 30.downto(0) {|n| print a[n] } # => 0000000000000000011001100101010 a = 9**15 50.downto(0) {|n| print a[n] } # => 000101110110100000111000011110010100111100010111001
n[i] は (n >> i) & 1 と等価なので、負のインデックスは常に 0 を返します。
p 255[-1] # => 0
self[nth]=bit (つまりビットの修正) がないのは、Numeric 関連クラスが immutable であるためです。
self ^ other -> Integer
[permalink][rdoc][edit]-
ビット二項演算子。排他的論理和を計算します。
- [PARAM] other:
- 数値
例:
1 ^ 1 # => 0 2 ^ 3 # => 1
abs -> Integer
[permalink][rdoc][edit]magnitude -> Integer
-
self の絶対値を返します。
例:
-12345.abs # => 12345 12345.abs # => 12345 -1234567890987654321.abs # => 1234567890987654321
allbits?(mask) -> bool
[permalink][rdoc][edit]-
self & mask の全てのビットが 1 なら true を返します。
self & mask == mask と等価です。
- [PARAM] mask:
- ビットマスクを整数で指定します。
42.allbits?(42) # => true 0b1010_1010.allbits?(0b1000_0010) # => true 0b1010_1010.allbits?(0b1000_0001) # => false 0b1000_0010.allbits?(0b1010_1010) # => false
[SEE_ALSO] Integer#anybits?
[SEE_ALSO] Integer#nobits?
anybits?(mask) -> bool
[permalink][rdoc][edit]-
self & mask のいずれかのビットが 1 なら true を返します。
self & mask != 0 と等価です。
- [PARAM] mask:
- ビットマスクを整数で指定します。
42.anybits?(42) # => true 0b1010_1010.anybits?(0b1000_0010) # => true 0b1010_1010.anybits?(0b1000_0001) # => true 0b1000_0010.anybits?(0b0010_1100) # => false
[SEE_ALSO] Integer#allbits?
[SEE_ALSO] Integer#nobits?
bit_length -> Integer
[permalink][rdoc][edit]-
self を表すのに必要なビット数を返します。
「必要なビット数」とは符号ビットを除く最上位ビットの位置の事を意味します。2**n の場合は n+1 になります。self にそのようなビットがない(0 や -1 である)場合は 0 を返します。
例: ceil(log2(int < 0 ? -int : int+1)) と同じ結果
(-2**12-1).bit_length # => 13 (-2**12).bit_length # => 12 (-2**12+1).bit_length # => 12 -0x101.bit_length # => 9 -0x100.bit_length # => 8 -0xff.bit_length # => 8 -2.bit_length # => 1 -1.bit_length # => 0 0.bit_length # => 0 1.bit_length # => 1 0xff.bit_length # => 8 0x100.bit_length # => 9 (2**12-1).bit_length # => 12 (2**12).bit_length # => 13 (2**12+1).bit_length # => 13
[SEE_ALSO] Integer#size
ceil(ndigits = 0) -> Integer
[permalink][rdoc][edit]-
self と等しいかより大きな整数のうち最小のものを返します。
- [PARAM] ndigits:
- 10進数での小数点以下の有効桁数を整数で指定します。負の整数を指定した場合、小数点位置から左に少なくとも n 個の 0 が並びます。
1.ceil # => 1 1.ceil(2) # => 1 18.ceil(-1) # => 20 (-18).ceil(-1) # => -10
[SEE_ALSO] Numeric#ceil
chr -> String
[permalink][rdoc][edit]chr(encoding) -> String
-
与えられたエンコーディング encoding において self を文字コードと見た時、それに対応する一文字からなる文字列を返します。引数無しで呼ばれた場合は self を US-ASCII、ASCII-8BIT、デフォルト内部エンコーディングの順で優先的に解釈します。
p 65.chr # => "A" p 0x79.chr.encoding # => #<Encoding:US_ASCII> p 0x80.chr.encoding # => #<Encoding:ASCII_8BIT> p 12354.chr Encoding::UTF_8 # => "あ" p 12354.chr Encoding::EUC_JP # => RangeError: invalid codepoint 0x3042 in EUC-JP p 12354.chr Encoding::ASCII_8BIT # => RangeError: 12354 out of char range p (2**32).chr # => RangeError: bignum out of char range
- [PARAM] encoding:
- エンコーディングを表すオブジェクト。Encoding::UTF_8、'shift_jis' など。
- [RETURN]
- 一文字からなる文字列
- [EXCEPTION] RangeError:
- self を与えられたエンコーディングで正しく解釈できない場合に発生します。
[SEE_ALSO] String#ord
denominator -> Integer
[permalink][rdoc][edit]-
分母(常に1)を返します。
- [RETURN]
- 分母を返します。
例:
10.denominator # => 1 -10.denominator # => 1
[SEE_ALSO] Integer#numerator
digits -> [Integer]
[permalink][rdoc][edit]digits(base) -> [Integer]
-
base を基数として self を位取り記数法で表記した数値を配列で返します。 base を指定しない場合の基数は 10 です。
16.digits # => [6, 1] 16.digits(16) # => [0, 1]
self は非負整数でなければいけません。非負整数でない場合は、Math::DomainErrorが発生します。
-10.digits # Math::DomainError: out of domain が発生
- [RETURN]
- 位取り記数法で表した時の数値の配列
- [PARAM] base:
- 基数となる数値。
- [EXCEPTION] ArgumentError:
- base に正の整数以外を指定した場合に発生します。
- [EXCEPTION] Math::DomainError:
- 非負整数以外に対して呼び出した場合に発生します。
div(other) -> Integer
[permalink][rdoc][edit]-
整商(整数の商)を返します。普通の商(剰余を考えない商)を越えない最大の整数をもって整商とします。
other が Integer オブジェクトの場合、Integer#/ の結果と一致します。
div に対応する剰余メソッドは modulo です。
- [PARAM] other:
- 二項演算の右側の引数(対象)
- [RETURN]
- 計算結果
7.div(2) # => 3 7.div(-2) # => -4 7.div(2.0) # => 3 7.div(Rational(2, 1)) # => 3 begin 2.div(0) rescue => e e # => #<ZeroDivisionError: divided by 0> end begin 2.div(0.0) rescue => e e # => #<ZeroDivisionError: divided by 0> # Integer#/ と違い、引数が Float でもゼロで割ることはできない end
[SEE_ALSO] Integer#fdiv, Integer#/, Integer#modulo
divmod(other) -> [Integer, Numeric]
[permalink][rdoc][edit]-
self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。 商 q は常に整数ですが、余り r は整数であるとは限りません。
- [PARAM] other:
- self を割る数。
[SEE_ALSO] Numeric#divmod
downto(min) {|n| ... } -> self
[permalink][rdoc][edit]downto(min) -> Enumerator
-
self から min まで 1 ずつ減らしながらブロックを繰り返し実行します。 self < min であれば何もしません。
- [PARAM] min:
- 数値
- [RETURN]
- self を返します。
例:
5.downto(1) {|i| print i, " " } # => 5 4 3 2 1
[SEE_ALSO] Integer#upto, Numeric#step, Integer#times
even? -> bool
[permalink][rdoc][edit]-
自身が偶数であれば真を返します。そうでない場合は偽を返します。
例:
10.even? # => true 5.even? # => false
fdiv(other) -> Numeric
[permalink][rdoc][edit]-
self を other で割った商を Float で返します。ただし Complex が関わる場合は例外です。その場合も成分は Float になります。
- [PARAM] other:
- self を割る数を指定します。
[SEE_ALSO] Numeric#quo, Numeric#div, Integer#div
floor(ndigits = 0) -> Integer
[permalink][rdoc][edit]-
self と等しいかより小さな整数のうち最大のものを返します。
- [PARAM] ndigits:
- 10進数での小数点以下の有効桁数を整数で指定します。負の整数を指定した場合、小数点位置から左に少なくとも n 個の 0 が並びます。
1.floor # => 1 1.floor(2) # => 1 18.floor(-1) # => 10 (-18).floor(-1) # => -20
[SEE_ALSO] Numeric#floor
gcd(n) -> Integer
[permalink][rdoc][edit]-
自身と整数 n の最大公約数を返します。
- [EXCEPTION] ArgumentError:
- n に整数以外のものを指定すると発生します。
例:
2.gcd(2) # => 2 3.gcd(7) # => 1 3.gcd(-7) # => 1 ((1<<31)-1).gcd((1<<61)-1) # => 1
また、self や n が 0 だった場合は、0 ではない方の整数の絶対値を返します。
3.gcd(0) # => 3 0.gcd(-7) # => 7
[SEE_ALSO] Integer#lcm, Integer#gcdlcm
gcdlcm(n) -> [Integer]
[permalink][rdoc][edit]-
自身と整数 n の最大公約数と最小公倍数の配列 [self.gcd(n), self.lcm(n)] を返します。
- [EXCEPTION] ArgumentError:
- n に整数以外のものを指定すると発生します。
例:
2.gcdlcm(2) # => [2, 2] 3.gcdlcm(-7) # => [1, 21] ((1<<31)-1).gcdlcm((1<<61)-1) # => [1, 4951760154835678088235319297]
[SEE_ALSO] Integer#gcd, Integer#lcm
to_s(base=10) -> String
[permalink][rdoc][edit]inspect(base=10) -> String
-
整数を 10 進文字列表現に変換します。
引数を指定すれば、それを基数とした文字列表現に変換します。
p 10.to_s(2) # => "1010" p 10.to_s(8) # => "12" p 10.to_s(16) # => "a" p 35.to_s(36) # => "z"
- [RETURN]
- 数値の文字列表現
- [PARAM] base:
- 基数となる 2 - 36 の数値。
- [EXCEPTION] ArgumentError:
- base に 2 - 36 以外の数値を指定した場合に発生します。
integer? -> true
[permalink][rdoc][edit]-
常に真を返します。
例:
1.integer? # => true 1.0.integer? # => false
lcm(n) -> Integer
[permalink][rdoc][edit]-
自身と整数 n の最小公倍数を返します。
- [EXCEPTION] ArgumentError:
- n に整数以外のものを指定すると発生します。
例:
2.lcm(2) # => 2 3.lcm(-7) # => 21 ((1<<31)-1).lcm((1<<61)-1) # => 4951760154835678088235319297
また、self や n が 0 だった場合は、0 を返します。
3.lcm(0) # => 0 0.lcm(-7) # => 0
[SEE_ALSO] Integer#gcd, Integer#gcdlcm
next -> Integer
[permalink][rdoc][edit]succ -> Integer
-
self の次の整数を返します。
例:
1.next #=> 2 (-1).next #=> 0 1.succ #=> 2 (-1).succ #=> 0
[SEE_ALSO] Integer#pred
nobits?(mask) -> bool
[permalink][rdoc][edit]-
self & mask のすべてのビットが 0 なら true を返します。
self & mask == 0 と等価です。
- [PARAM] mask:
- ビットマスクを整数で指定します。
42.nobits?(42) # => false 0b1010_1010.nobits?(0b1000_0010) # => false 0b1010_1010.nobits?(0b1000_0001) # => false 0b0100_0101.nobits?(0b1010_1010) # => true
[SEE_ALSO] Integer#allbits?
[SEE_ALSO] Integer#anybits?
numerator -> Integer
[permalink][rdoc][edit]-
分子(常に自身)を返します。
- [RETURN]
- 分子を返します。
例:
10.numerator # => 10 -10.numerator # => -10
[SEE_ALSO] Integer#denominator
odd? -> bool
[permalink][rdoc][edit]-
自身が奇数であれば真を返します。そうでない場合は偽を返します。
例:
5.odd? # => true 10.odd? # => false
ord -> Integer
[permalink][rdoc][edit]-
自身を返します。
10.ord #=> 10 # String#ord ?a.ord #=> 97
[SEE_ALSO] String#ord
pred -> Integer
[permalink][rdoc][edit]-
self から -1 した値を返します。
1.pred #=> 0 (-1).pred #=> -2
[SEE_ALSO] Integer#next
rationalize -> Rational
[permalink][rdoc][edit]rationalize(eps) -> Rational
-
自身を Rational に変換します。
- [PARAM] eps:
- 許容する誤差
引数 eps は常に無視されます。
例:
2.rationalize # => (2/1) 2.rationalize(100) # => (2/1) 2.rationalize(0.1) # => (2/1)
remainder(other) -> Numeric
[permalink][rdoc][edit]-
self を other で割った余り r を返します。
r の符号は self と同じになります。
- [PARAM] other:
- self を割る数。
例:
5.remainder(3) # => 2 -5.remainder(3) # => -2 5.remainder(-3) # => 2 -5.remainder(-3) # => -2 -1234567890987654321.remainder(13731) # => -6966 -1234567890987654321.remainder(13731.24) # => -9906.22531493148
[SEE_ALSO] Integer#divmod, Integer#modulo, Numeric#modulo
round(ndigits = 0, half: :up) -> Integer
[permalink][rdoc][edit]-
self ともっとも近い整数を返します。
- [PARAM] ndigits:
- 10進数での小数点以下の有効桁数を整数で指定します。負の整数を指定した場合、小数点位置から左に少なくとも n 個の 0 が並びます。
- [PARAM] half:
- ちょうど半分の値の丸め方を指定します。サポートされている値は以下の通りです。
- :up or nil: 0から遠い方に丸められます。
- :even: もっとも近い偶数に丸められます。
- :down: 0に近い方に丸められます。
1.round # => 1 1.round(2) # => 1 15.round(-1) # => 20 (-15).round(-1) #=> -20 25.round(-1, half: :up) # => 30 25.round(-1, half: :down) # => 20 25.round(-1, half: :even) # => 20 35.round(-1, half: :up) # => 40 35.round(-1, half: :down) # => 30 35.round(-1, half: :even) # => 40 (-25).round(-1, half: :up) # => -30 (-25).round(-1, half: :down) # => -20 (-25).round(-1, half: :even) # => -20
[SEE_ALSO] Numeric#round
size -> Integer
[permalink][rdoc][edit]-
整数の実装上のサイズをバイト数で返します。
例:
p 1.size p 0x1_0000_0000.size # => 4 8
[SEE_ALSO] Integer#bit_length
times {|n| ... } -> self
[permalink][rdoc][edit]times -> Enumerator
-
self 回だけ繰り返します。 self が正の整数でない場合は何もしません。
またブロックパラメータには 0 から self - 1 までの数値が渡されます。
3.times { puts "Hello, World!" } # Hello, World! と3行続いて表示される。 0.times { puts "Hello, World!" } # 何も表示されない。 5.times {|n| print n } # 01234 と表示される。
[SEE_ALSO] Integer#upto, Integer#downto, Numeric#step
to_f -> Float
[permalink][rdoc][edit]-
self を浮動小数点数(Float)に変換します。
self が Float の範囲に収まらない場合、Float::INFINITY を返します。
1.to_f # => 1.0 (Float::MAX.to_i * 2).to_f # => Infinity (-Float::MAX.to_i * 2).to_f # => -Infinity
to_i -> self
[permalink][rdoc][edit]to_int -> self
-
self を返します。
例:
10.to_i # => 10
to_r -> Rational
[permalink][rdoc][edit]-
自身を Rational に変換します。
例:
1.to_r # => (1/1) (1<<64).to_r # => (18446744073709551616/1)
truncate(ndigits = 0) -> Integer
[permalink][rdoc][edit]-
0 から self までの整数で、自身にもっとも近い整数を返します。
- [PARAM] ndigits:
- 10進数での小数点以下の有効桁数を整数で指定します。負の整数を指定した場合、小数点位置から左に少なくとも n 個の 0 が並びます。
1.truncate # => 1 1.truncate(2) # => 1 18.truncate(-1) #=> 10 (-18).truncate(-1) #=> -10
[SEE_ALSO] Numeric#truncate
upto(max) {|n| ... } -> Integer
[permalink][rdoc][edit]upto(max) -> Enumerator
-
self から max まで 1 ずつ増やしながら繰り返します。 self > max であれば何もしません。
- [PARAM] max:
- 数値
- [RETURN]
- self を返します。
例:
5.upto(10) {|i| print i, " " } # => 5 6 7 8 9 10
[SEE_ALSO] Integer#downto, Numeric#step, Integer#times
self | other -> Integer
[permalink][rdoc][edit]-
ビット二項演算子。論理和を計算します。
- [PARAM] other:
- 数値
例:
1 | 1 # => 1 2 | 3 # => 3
~ self -> Integer
[permalink][rdoc][edit]-
ビット演算子。否定を計算します。
例:
~1 # => -2 ~3 # => -4 ~-4 # => 3