割る2

本稿では数学における割る2(英: Division by two)や半分(英: halving)について述べる[1]。古代エジプト以降 …

割る2
An orange on a white plate that has been divided in half.
半分に切ったオレンジ。

本稿では数学における割る2: Division by two)や半分: halving)について述べる[1]。古代エジプト以降[2][3]、この操作は他の数による乗除とは別に扱うようになった。古代エジプトの乗算英語版は、割る2を1ステップと数えている[4]。16世紀末の数学者の中でもこれを別の演算として扱ったものもおり、現代のコンピュータ・プログラミングでも最適化の文脈で別個に扱うことがあ[5]る。この操作は、10進法でも、コンピューター・プログラミングで使われる2進法でも、その他の偶数基底でも簡単である。奇数2割るには、解法((N-1)÷2)+0.5を使う。例えば、N=7の場合、((7-1)÷2)+0.5=3.5となり、7÷2=3.5となる。

2進数

23(0b10111)を2で割る際に、論理右シフトを使って商を11(0b1011)にする過程。

bit演算では、割る2はシフト演算によっても実装できる。これは演算子強度の最適化の一形態である。例えば、0b01101001(十進数の105)は、1つ右にシフトすると0b00110100(十進数の52)になる。この時、最下位の1は消える。同様に、二の冪による除算は、回右にシフトすることで実装できる。ビットシフトは除算よりもはるかに高速な演算であるから、大変な最適化が見込める[6]。しかし、コード移植性可読性のためには、除算演算を使ってプログラムを書き、この置換をコンパイラに任せる英語版のが最善であることが多い[7]。以下はRubyでの例である[注釈 1]

number = 0b1101001 # => 105 (2進数リテラル)
number >> 1        # => 105 / 2^1 = 52
number >> 4        # => 105 / 2^4 = 6

しかし、符号付き2進数の除算を扱う場合、上記の記述は常に正しいとは限らない。右へ1ビットシフトすると2で除算され、常に切り捨てられる。しかし、いくつかの言語では、符号付き2進数の除算は0に向かって丸められる(結果が負の場合、切り上げを意味する)。

Javaはそのような言語の1つで、Javaでは-3 / 2-1と評価されるのに対し、-3 >> 1-2と評価される。したがってこの場合、コンパイラは、配当が負になる可能性がある場合に、ビットシフトで置き換えることによって2による除算を最適化することはできない。

浮動小数点数

浮動小数点数の演算では、割る2は指数を1減らすことで実行できる(ただし、結果が非正規化数にならない場合に限る)。多くのプログラミング言語には、浮動小数点数を2の冪で除算するための関数が用意されている[8]。例えば、Javaでは、2の累乗でスケーリングするためのメソッドjava.lang.Math.scalbが提供されており、C言語では、同じ目的で関数ldexp が提供されている[9]

十進数

以下のアルゴリズムは10進数のものである。しかし、偶数底の任意の数Nの半分を取るアルゴリズムを構築するためのモデルとして使用することができる。

  1. Nを書き出し、その左にゼロを置く。
  2. 2桁ずつに分け、以下の表に従って結果の数を書き出す。
最初の桁が 偶数 偶数 偶数 偶数 偶数 奇数 奇数 奇数 奇数 奇数
次の桁が 0 or 1 2 or 3 4 or 5 6 or 7 8 or 9 0 or 1 2 or 3 4 or 5 6 or 7 8 or 9
出力 0 1 2 3 4 5 6 7 8 9

例: 1738/2=?

「01738」と書ける。

  • 01: 偶数桁の後に1が続く場合、0。
  • 17: 奇数桁の後に7が続く場合、8。
  • 73: 奇数桁の後に3が続く場合、6。
  • 38: 奇数桁の後に8が続く場合、9。

結果: 0869.

この例から、0は偶数であることがわかる。

Nの下1桁が奇数の場合は、結果に0.5を加える。

偶奇性

キュイゼネア・ロッドを用いた偶奇性の説明
5と6の偶奇性をキュイゼネア・ロッド英語版を使って描いたもの。5は同じ色/長さのどの2本の棒でも均等に2等分できないが、6は3本で均等に2等分できる。

整数の場合、分母が2の割り算は数の偶奇性に関係する。偶数(2そのものと0を含む)は2で割り切れるが、奇数は割り切れない。

その他の用途

計算の簡略化

5を掛けるには、まず2で割ってから10を掛ける[10]。25を5倍する場合、まず25を2で割って12.5とし、次に10を掛けて125とすることで計算を簡略化できる。

二分探索

割る2は、計算機科学における二分探索にも利用されている。これは探索の目標と配列の中央に位置する要素を比較し、等しければその値を返す、等しくなければ目標が存在する可能性がない半分を除外し、残りの半分を同じ方法で探索するということを繰り返す探索アルゴリズムである[11]。二分探索では最悪計算時間がとなり、これは線形探索よりも高速である[12][13]

脚注

出典

  1. ^ Steele, Robert (1922), The Earliest arithmetics in English, Early English Text Society, 118, Oxford University Press, p. 82 .
  2. ^ Jackson, Lambert Lincoln (1906), The educational significance of sixteenth century arithmetic from the point of view of the present time, Contributions to education, 8, Columbia University, p. 76 .
  3. ^ Waters, E. G. R. (1929), “A Fifteenth Century French Algorism from Liége”, Isis 12 (2): 194–236, doi:10.1086/346408, JSTOR 224785, https://www.jstor.org/stable/224785 .
  4. ^ Chabert, Jean-Luc; Barbin, Évelyne (1999), A history of algorithms: from the pebble to the microchip, Springer-Verlag, p. 16, ISBN 978-3-540-63369-3 .
  5. ^ Wadleigh, Kevin R.; Crawford, Isom L. (2000), Software optimization for high-performance computing, Prentice Hall, p. 92, ISBN 978-0-13-017008-8 .
  6. ^ Wadleigh, Kevin R.; Crawford, Isom L. (2000), Software optimization for high-performance computing, Prentice Hall, p. 92, ISBN 978-0-13-017008-8, https://archive.org/details/softwareoptimiza0000wadl/page/92 .
  7. ^ Hook, Brian (2005), Write portable code: an introduction to developing software for multiple platforms, No Starch Press, p. 133, ISBN 978-1-59327-056-8 .
  8. ^ Math.scalb”. Java Platform Standard Ed. 6. 2009年10月11日閲覧。
  9. ^ Programming languages — C, International Standard ISO/IEC 9899:1999 , Section 7.12.6.6.
  10. ^ 优等生必学的速算技巧大全”. 清華大學出版社 (2018年). 2019年8月18日時点のオリジナルよりアーカイブ。2019年4月24日閲覧。
  11. ^ 久雄, 矢沢. “サーチのアルゴリズム (2) 二分探索法|新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門”. 基本情報技術者試験 受験ナビ. 2025年11月4日閲覧。
  12. ^ 初心者でもわかる二分探索法:簡単な実装とその優れた効率性|プロダクト共創組織”. note(ノート) (2024年12月25日). 2025年11月4日閲覧。
  13. ^ アルゴリズムを勉強するなら二分探索から始めよう! 『なっとく!アルゴリズム』より”. CodeZine (2017年2月8日). 2025年11月4日閲覧。

注釈

  1. ^ int型なので、小数点以下は切り捨てとなる。

関連項目

  • 1/2
  • 中央値:データ値の集合を2つの等しい部分集合に分割する値。
  • 二等分線:幾何学的対象を2つの等しい半分の部分に分割する線。
  • マーシャリング:紋章学において、二つの紋章を結合する手法の一つで、そのデザインを半分に分割する方法。
  • 零除算:ゼロによる除算。一般には定義不可能とされる。
  • 無限大による除算英語版:一般には定義できないが、極限の文脈は意味を持つ。

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.