Share to: share facebook share twitter share wa share telegram print page

ビット演算

ビット演算(ビットえんざん、: bitwise operation)とは、主にコンピュータで行われる演算のひとつで、データをビット列(つまり0か1が多数並んだもの)と見なして、各ビットの移動やビット単位での論理演算を行うもの[1]

概要

デジタルコンピュータの内部では、情報をビット列として表しており、CPUやMPUなどにはビット演算用の命令が多種用意されている[1]。特に機械語のプログラムでは多用される演算であり、高水準言語のソースコードでは直接記述されていない場合でも結局機械語に変換されて実行されるので、内部的に多用されている[1]

ビット演算は大きく分けて次のように二種類ある[1]

NOT, AND, OR, XOR, など[2]がある。
  • ビットの位置を入れ替える操作[1]
大きく分けるとシフト演算(一方向に単純に移動させる操作)とローテート演算(ビット列の先頭と末尾を繋いだように循環させる操作(「循環シフト」「環状シフト」「ビット回転」とも)がある[1]

実装の観点からは、現在一般的なエレクトロニクス式デジタルコンピュータでは、加減算ではビットあたり数個程度の論理ゲートに加え多少複雑なキャリー伝搬の処理が、乗除算では多段に渡る処理が必要であるのに対し、ビット演算は1個か高々2個の論理ゲートで行えるため、多くの場合、最短サイクルしか必要としない。(つまりビット演算は、CPUの演算の中でも特に高速に行われる。)そのことから、高性能なプログラムを実現するための機械語コーディングではビット演算の使いこなしは重要なテクニックである[3]。また内部的には論理演算はALUで、(多桁の)シフトはバレルシフタで演算される。

応用例

種類

各演算について説明し、その演算の基本を解説。 ビット演算の種類を示す演算子をビット演算子(bitwise operator)という。おまけだが、各プログラミング言語での表記法も紹介する。

なお現状では肝心のアセンブリ言語での表記法(や文法)が説明されていないが、今後説明してゆく。とりあえずx86のアセンブリ言語でのビット演算の表記法については当ウィキペディアと姉妹サイトであるWikibookにまとめた記事があるのでそちらを参照のこと(x86, Logicx86, Shift and Rotate)。

論理演算

NOT

ビット単位NOTあるいは補数とは論理否定を各ビットに対して行う単項演算。0 は 1 になり、1 は 0 になる。各ビットを反転させるのでビット反転ともいう。

NOT 0111
  = 1000

C言語C++では、NOT演算子は "~" (チルダ)である。

x = ~y;

この例では、x に "NOT y" の結果を格納する。これは、Cおよび C++の論理「否定」演算子 "!" (エクスクラメーションマーク)とは異なる。こちらは与えられた数値全体をひとつのブーリアンとして扱う。

x = !y;

この例では、xy が "false" であれば "true" を表すブーリアン値を格納し、y が "true" であれば "false" を格納する。CやC++では、数値はゼロでないとき "true" を示すとされる。論理「否定」はビットレベルの演算ではないので、一般的にはビット演算とは考えられない。

ビット単位NOTは二進数値の1の補数を作るのに使える。そして2の補数を作るときの途中の段階にも使われる。

OR

ビット単位ORは、ふたつの同じ長さのビットパターンを入力とし、同じ位置のビット毎に論理的ORを行って同じ長さのビットパターンを出力する操作である。各ビット位置で、入力のふたつのビットのどちらかでも 1 であれば、出力ビットは 1 となる。

   0101
OR 0011
 = 0111

C/C++では、ビット単位OR演算子は "|" (縦棒)で表される。

x = y | z;

この例では、"y OR z" の結果を x に格納する。これは、C/C++の論理「和」演算子 "||" (ふたつの縦棒)とは異なる。こちらは、オペランドを論理値として取り扱い、結果を "true" か "false" とする。

ビット単位ORは、ビット列がフラグ列として扱われるときによく使われる。つまり、各ビットが個別にブーリアン値を表している場合である。ある二進数値とひとつ以上の1を含むビット列とをビット単位ORを行うと、後者のビット列で 1 となっている位置が結果として出てくるビット列でも1となる。

0010

このビット列は4つのフラグを表しているものとみなす。1番目、2番目、4番目は (0) にセットされていて、3番目が (1) にセットされている。1番目のフラグをセットするには、このビット列にビット単位ORを行えばよい。そのときのもう一方のビット列は1番目のビットだけを1にセットしておく。

   0010
OR 1000
 = 1010

このテクニックはメモリが少ない環境向けのプログラムでよく使われる。ひとつのビットパターンで各種ステータスを一度に表現するのである。

また、MIPSアーキテクチャでは、命令セットを縮小するためにこれを使っている。MIPSではレジスタ間ロード(レジスタからレジスタへの値のコピー)命令がない。その代わりにゼロレジスタという常に内容がゼロで、何かを書き込んでも値が変わらないレジスタがある。そこで、レジスタ間ロードはビット単位OR命令を使って、ゼロレジスタとあるレジスタの ビット単位OR の結果を別のレジスタに格納することで実現される。

XOR

ビット単位XORは、ふたつの同じ長さのビットパターンを入力とし、同じ位置のビット毎に論理的XORを行って同じ長さのビットパターンを出力する操作である。各ビット位置で、入力するふたつのビットが違う値であれば、出力ビットは1となる。

    0101
XOR 0011
  = 0110

C/C++では、ビット単位XOR演算子は "^" (サーカムフレックス)で表される。

x = y ^ z;

この例では、"y XOR z" の結果を x に格納する。

アセンブリ言語プログラマはレジスタの内容をゼロにしたいときに XOR 操作を行う。多くのアーキテクチャでは、ゼロという値をロードしてレジスタに格納するよりもXORを行う方がCPUクロックサイクルを消費せず、また命令長も短いためメモリを節約できる[5]。同じ値をビット単位XORのふたつの入力として使うと、出力は常にゼロになる。つまり、同じレジスタを指定したXOR命令を実行して同じレジスタに戻すことでその内容をゼロにすることができる。もちろん、MIPSアーキテクチャの場合は入力としてゼロレジスタを使えば、ORでも XORでもANDでもADDでも結果をゼロにすることができる。

ビット単位XORはフラグの値を変更するときにも使われる。

0010

このビットパターンで1番目のビットと3番目のビットを同時に変更したい場合、もうひとつのビットパターンで、その変えたい位置に1を置いておく。

    0010
XOR 1010
  = 1000

このテクニックはビットパターンをブーリアン変数の並びとして扱うときに使われるだろう。

関連項目

AND

ビット単位ANDは、ふたつの同じ長さのビットパターンを入力とし、同じ位置のビット毎に論理的ANDを行って同じ長さのビットパターンを出力する操作である。各ビット位置で、入力するふたつのビットがどちらも1であれば、出力ビットは 1 となる。

    0101
AND 0011
  = 0001

C/C++では、ビット単位AND演算子は "&" (アンパサンド)で表される。

x = y & z;

この例では、"y AND z" の結果を x に格納する。これは、C/C++の論理「積」演算子 "&&" (ふたつのアンパサンド)とは異なる。こちらは、オペランドをブーリアン値として取り扱い、結果を "true" か "false" とする。

ビット単位ANDはビットマスク操作として使われることもある。これは、ビット列の一部を取り出すのに使われたり、ある特定のビットが1か0かを調べるのにも使われる。

ビット列の一部を取り出す例
11001011

この例で、末尾4ビットぶんのデータを取り出すには、取り出したいビット位置だけを 1 にしたビットパターンを入力する。

    11001011
AND     1111
  =     1011
特定ビットの確認例
0101

この例で、二番目のビットが 1 かどうかを調べるには、ビット単位ANDに対して、その調べたいビット位置だけを1にしたビットパターンを入力する。

    0101
AND 0010
  = 0000

この結果はゼロなので、二番目のビットは0であったことがわかる。このようなビット単位ANDの使い方はビットマスクと呼ばれる。このとき、関心のないビット位置は0にする。

ビットシフト

ビットシフトも、通常ビット演算の一種として扱われる。[注釈 1]

ビットシフトは大きく分けるとシフト演算(一方向に単純に移動させる操作)とローテート演算(ビット列の先頭と末尾を繋いだように循環させる操作(「循環シフト」「環状シフト」「ビット回転」とも)とに分けられる[1]

全ビットを一律に移動する操作を「論理シフト」(: logical shift)という。一方、右シフトの際に最上位ビットだけは動かさずに保存するシフト操作を「算術シフト」(: arithmetic shift)といい、これは最上位ビットを符号ビットとする「符号付き整数」を処理するのに適している[1]

コンピュータのプロセッサ内のレジスタのビット数(桁数)は有限であるので、これに対するシフト演算(一方向に単純に移動させる操作)はいくつかのビットがレジスタからはみ出す。外から入ってくるビットとはみ出すビットをどう扱うかにより、いくつもの種類がある。

算術シフト

算術シフトでは、右シフトにおいて、最上位ビット(2の補数表現であれば符号ビット)は保存される。左シフトは、(一部例外を除き[6])後述する論理シフトと同じもので、空くビット位置にはゼロが入る。このシフトではあふれたビットは単に消える(プロセッサの実装によってはフラグに入るものもある)。下記の例は 4ビットレジスタの場合である。

  0111 LEFT-SHIFT
= 1110
  1011 RIGHT-SHIFT
= 1101

前者の例は、左端の0はあふれて消え、あらたな0が右端に入れられている。後者の例は、右端の1はあふれて消え、符号ビット1が左端にコピーされている。あふれたビットは、多くの場合キャリーフラグにセットされる。マルチプルシフトは、シングルシフトをくりかえしたものと同じ結果になる。

  0111 LEFT-SHIFT-BY-TWO
= 1100

C/C++では、左シフトと右シフトは "<<" と ">>" で表される。シフトする幅は右オペランドにより指定できる。#注意事項も参照。

x = y << 2;

この例では、y を2桁左に算術シフトした結果を x に格納する。

1ビットの左算術シフトは2倍するのと同じである。1ビットの右算術シフトは、値が非負であれば2で割ってあまりを捨てるのと同じである。

負の値を右に算術シフトした場合は、シフトしてあふれたビットが1なら(複数シフトの場合は、あふれたビットの中に1がある場合には)、結果に1を足せば、2または2のべきで割ってあまりを捨てるのと同じになる。

論理シフト

論理シフトでは、右シフトのときも空いたビットをゼロにする。他は算術シフトと同様である。したがって、論理シフトは符号無しの二進数を扱うのに適していて、算術シフトは2の補数表現の符号付き二進数を扱うのに適している。

(キャリーなし)ローテート

もうひとつのシフトとして循環シフトすなわちビット・ローテーションがある。これはビット列の左端と右端がつながっているように扱ってシフトするものである。シフト方向の端をあふれた桁は逆の端に置かれる。これは、存在するビットを残しておく必要があるとき、ビットの位置を変えるのに使われたりする。

キャリーつきローテート

キャリーつき右ローテート
キャリーつき左ローテート

こちらはローテート操作の際に、(キャリー)フラグを挟んで、ビット列の左端と右端がつながっているように扱う。フラグに最上位ビットのコピーを入れておけば算術シフトを、0を入れておけば論理シフトをシミュレートできることから、PICのようなマイクロコントローラではローテートとキャリー付きローテートだけを用意して、算術シフトや論理シフト命令は用意しないものもある。キャリー付きローテートは特にプロセッサのレジスタのビット幅より大きな数値のシフトを実現する場合に便利である。

その他

使用例

マシンは算術演算や論理演算をするのに十分な命令を持っているが、実際全ての演算はビット演算の組み合わせと何らかのゼロ判定機能があれば実現できる。例えば、下記の例はふたつの任意の整数 ab の乗算をビットシフトと加算で実現する擬似コードである。

c := 0
while b ≠ 0
    if b and 1 ≠ 0
        c := c + a
    shift a left by one
    shift b right by one
return c

注意事項

ビットシフトに対して右オペランド(シフト量)の値が負である場合、あるいは左オペランドの型のビット数を超える場合の規定は言語によって異なる(あるいは言語によって規定されておらず、処理系定義や未定義や未規定であったりする)。 Java[7].NET言語 (C#VB.NETなど)、JavaScriptなどでは「左オペランドの型のビット数-1」のビット単位ANDのマスクを右オペランドにかける。これは最低でも1ビットは値を残すための配慮である。以下にC#の例を示す。

class BitShift
{
    static void Main()
    {
        int i = 1; // 32 bits
        long l = 1; // 64 bits

        // output: 0x2 (33 & (32-1) = 1 なので 1 ビット左シフト)
        System.Console.WriteLine("0x{0:x}", i << 33);

        // output: 0x200000000 (33 & (64-1) = 33 なので 33 ビット左シフト)
        System.Console.WriteLine("0x{0:x}", l << 33);
    }
}

C/C++ の ISO の仕様では、このような場合の結果は未定義となっている。GCCVisual C++ の実装においては、Warning が出るが、上記と同じ結果を返す。

脚注

  1. ^ a b c d e f g h i IT用語辞典 e-words【ビット演算】
  2. ^ 論理的にかぞえ尽くすと16種類あるが、有用なものは以上である。
  3. ^ 参考文献: 『ハッカーのたのしみ 本物のプログラマはいかにして問題を解くか
  4. ^ [1]
  5. ^ Microsoft Visual C++など、C/C++でゼロを代入するコードを記述した場合、XOR命令を使用するよう最適化するコンパイラも存在する。
  6. ^ VHDLには論理左シフトと異なる算術左シフトslaがあり en:Arithmetic_shift#cite_note-10 によれば、空くビット位置を保存する。また CASL#COMET の仕様にあるSLA命令は、符号ビットを保存しながら左シフトする。
  7. ^ 15.19. Shift Operators - Java Language Specification
  1. ^ ビット並列アルゴリズムは特に、NEONARM)あるいはSSE/AVXx86)などのSIMD拡張命令をサポートするCPUGPUといった、容易に入手可能なハードウェアにおける高効率プログラミングの鍵である。
  1. ^ シフトはビット演算ではないという考え方をする人もいる。「数値全体に対するものでビット毎に操作するものではないから」と[要出典]

関連項目

Read other articles:

Disambiguazione – Se stai cercando altri significati, vedi Volo (disambigua). Questa voce o sezione sugli argomenti aviazione e fisica non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Segui i suggerimenti dei progetti di riferimento 1, 2. Il volo è il processo mediante il quale un animale o un oggetto si muove attraverso uno spazio senza entrare in contatt…

Katedral AparecidaKatedral Basilika Tempat Ziarah Nasional Bunda Maria dari AparecidaPortugis: Basílica do Santuário Nacional de Nossa Senhora Aparecidacode: pt is deprecated Katedral AparecidaLokasiAparecidaNegara BrasilDenominasiGereja Katolik RomaSitus webSitus web resmi Tempat ziarah dalam bahasa PortugisSejarahTanggal konsekrasi4 Juli 1980ArsitekturStatusKatedral, Basilika minor, tempat ziarah nasionalStatus fungsionalAktifArsitekBenedito Calixto FilhoTipe arsitekturGerejaGayaKebangk…

هيولت نيك   الإحداثيات 40°37′23″N 73°41′49″W / 40.6231°N 73.6969°W / 40.6231; -73.6969  [1] تقسيم إداري  البلد الولايات المتحدة[2]  التقسيم الأعلى مقاطعة ناسو  خصائص جغرافية  المساحة 0.553107 كيلومتر مربع (1 أبريل 2010)  ارتفاع 2 متر  عدد السكان  عدد السكان 569 (1 أب…

Serie C1 1981-1982 Competizione Serie C1 Sport Calcio Edizione 4ª Organizzatore Lega Nazionale Serie C Date dal 20 settembre 1981al 30 maggio 1982 Luogo Italia Partecipanti 36 Formula 2 gironi all'italiana A/R Risultati Vincitore Atalanta (1º titolo)Arezzo (1º titolo) Altre promozioni MonzaCampobasso Retrocessioni RhodenseMantovaAlessandriaSant'AngeloCivitanoveseGiulianovaFrancavillaLatina Statistiche Miglior marcatore Gir. A: Giuseppe Galluzzo (19)Gir. B: Tullio Gritti (16) Inco…

У этого термина существуют и другие значения, см. Тамерлан (значения). В Википедии есть статьи о других людях с именем Тимур. Тамерланчагат. تیمور‎ Бюст Тимура, реконструкция М. М. Герасимова Великий эмирИмперии Тимуридов 9 апреля 1370 — 19 февраля 1405 Предшественник Хусей…

العلاقات الأوزبكستانية الطاجيكستانية أوزبكستان طاجيكستان   أوزبكستان   طاجيكستان تعديل مصدري - تعديل   العلاقات الأوزبكستانية الطاجيكستانية هي العلاقات الثنائية التي تجمع بين أوزبكستان وطاجيكستان.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة …

Pour les articles homonymes, voir Lazare (homonymie). Lazar HrebeljanovićLe prince Lazar.FonctionTsarTitre de noblesseStavilac (en)années 1350-années 1360BiographieNaissance 1329Prilepac (en) (royaume de Serbie (en))Décès 15 juin 1389Kosovo Field (en) (District of Branković (en))Sépulture Monastère de Ravanica (depuis 1391), Church of the Ascension in Priština (d) (1389-1391), Belgrade, Szentendre, monastère de Vrdnik-Ravanica (jusqu'en 1942), cathédrale Saint-Michel de Belgrade (1942…

Papa Gregorio IX178º papa della Chiesa cattolica Elezione19 marzo 1227 Insediamento21 marzo 1227 Fine pontificato22 agosto 1241(14 anni e 156 giorni) Cardinali creativedi Concistori di papa Gregorio IX Predecessorepapa Onorio III Successorepapa Celestino IV  NomeUgolino di Anagni dei conti di Segni NascitaAnagni, 1170 circa Creazione a cardinaledicembre 1198 da papa Innocenzo III MorteRoma, 22 agosto 1241 SepolturaAntica basilica di San Pietro in Vaticano Manuale Gregorio IX, nat…

تحتوي هذه المقالة اصطلاحات معربة غير مُوثَّقة. لا تشمل ويكيبيديا العربية الأبحاث الأصيلة، ويلزم أن تُرفق كل معلومة فيها بمصدر موثوق به. فضلاً ساهم في تطويرها من خلال الاستشهاد بمصادر موثوق بها تدعم استعمال المصطلحات المعربة في هذا السياق أو إزالة المصطلحات التي لا مصادر له…

Historic church in New York, United States United States historic placeChurch of the Holy Transfiguration of Christ-on-the-MountU.S. National Register of Historic Places Location325 Mead Mountain Road, Woodstock, New YorkBuilt1891[2]Architectural styleGothic Revival[2]NRHP reference No.05001385[1]Added to NRHPDecember 9, 2005 The Church of the Holy Transfiguration of Christ on the Mount is a modest, single-room, hand-built wooden church near the summit of M…

1999 soundtrack album by Various artistsDeep Blue SeaSoundtrack album by Various artistsReleasedJuly 27, 1999Recorded1999GenreHip hop, R&BLength1:45:00LabelWarner Bros. 9 47485-2ProducerVarious artistsSingles from Deep Blue Sea Say WhatReleased: August 3, 1999 Deepest BluestReleased: 1999 Just BecauseReleased: 1999 El Paraiso RicoReleased: 1999 Remote Control SoulReleased: 1999 Professional ratingsReview scoresSourceRatingAllmusic [1] Deep Blue Sea is the soundtrack to the 19…

External parts of the eye including eyebrow, eyelid, and lacrimal apparatus Accessory visual structuresFront of left eye with eyelids separated.DetailsIdentifiersLatinstructurae oculi accessoriae or adnexa oculiTA98A15.2.07.001TA26815FMA76554Anatomical terminology[edit on Wikidata] The accessory visual structures (or adnexa of eye, ocular adnexa, etc.) are the protecting and supporting structures (adnexa) of the eye, including the eyebrow, eyelids, and lacrimal apparatus. The eyebrows, eyeli…

Annual Argentine music festival This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article relies excessively on references to primary sources. Please improve this article by adding secondary or tertiary sources. Find sources: Creamfields BA – news · newspapers · books · scholar · JSTOR (January 2010) (Learn how and when to remove this message) This…

Essential oil derived from leaves This article is about essential oil isolated from the leaves of the tea tree, Melaleuca alternifolia. For the sweet seasoning oil pressed from Camellia seeds, C. sinensis or C. oleifera, see tea seed oil. Origin of this essential oil, the tea tree, Melaleuca alternifolia Tea tree plantation, Coraki, New South Wales Tea tree oil, also known as melaleuca oil, is an essential oil with a fresh, camphoraceous odor and a colour that ranges from pale yellow to nearly c…

Criminal and civil cases since 2017 Weinstein scandal redirects here. For the resignation of the Archivist of the United States, see Allen Weinstein § Sexual assault allegations. Harvey Weinstein in 2011 In October 2017, The New York Times and The New Yorker reported that dozens of women had accused the American film producer Harvey Weinstein of rape, sexual assault and sexual abuse over a period of at least 30 years. Over 80 women in the film industry eventually accused Weinstein of such …

99th Air Refueling Squadron 117th Air Refueling Wing KC-135s on the Birmingham ANGB flightlineActive1942–1944; 1957–1973; 1983–2008; 2009–presentCountry United StatesBranch United States Air ForceRoleAir RefuelingPart ofAir Mobility CommandGarrison/HQBirmingham Air National Guard BaseNickname(s)Black Knights[1]Ramrod (While Stationed at Westover 1957-1973)[citation needed]EngagementsKosovo Southwest Asia[2]DecorationsAir Force Outstanding Unit Award…

非常尊敬的讓·克雷蒂安Jean ChrétienPC OM CC KC  加拿大第20任總理任期1993年11月4日—2003年12月12日君主伊利沙伯二世总督Ray HnatyshynRoméo LeBlancAdrienne Clarkson副职Sheila Copps赫布·格雷John Manley前任金·坎貝爾继任保羅·馬田加拿大自由黨黨魁任期1990年6月23日—2003年11月14日前任約翰·特納继任保羅·馬田 高級政治職位 加拿大官方反對黨領袖任期1990年12月21日—1993年11月4日…

A celebratory Nowruz sign on Dousti Square. This following is a list of central squares in Dushanbe, the capital of Tajikistan. List of squares Dousti Square Main article: Dousti Square This square is the main plaza in Dushanbe and in the country. The name Dousti the Tajik language word for friendship. It is connected to Rudaki Avenue and Hofizi Sherozi Avenue. It is the largest of its kind in Dushanbe.[1] It was formerly known as Lenin Square, Ozodi Square and Somoni Square. Istikol Squ…

Coppa di Lussemburgo 2022-2023 Competizione Coppa di Lussemburgo Sport Pallavolo Edizione 57ª Organizzatore FLVB Date dal 5 novembre 2022al 27 marzo 2023 Luogo  Lussemburgo Partecipanti 15 Risultati Vincitore  Mamer(13º titolo) Secondo  Bartréng Statistiche Incontri disputati 14 Cronologia della competizione 2021-2022 2023-2024 Manuale La Coppa di Lussemburgo 2022-2023, 57ª edizione della coppa nazionale di pallavolo femminile, si è svolta dal 5 novembre 2022 al …

English association football player and manager David McGurk McGurk playing for York City in 2008Personal informationFull name David Michael McGurk[1]Date of birth (1982-09-30) 30 September 1982 (age 41)[2]Place of birth Middlesbrough, EnglandHeight 6 ft 0 in (1.83 m)[3]Position(s) Centre-backYouth career Sunderland1999–2001 DarlingtonSenior career*Years Team Apps (Gls)2001–2006 Darlington 56 (6)2004 → York City (loan) 6 (0)2005–2006 → York C…

Kembali kehalaman sebelumnya