Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 1817] ファイルの概要

このコミットは、Go言語の仕様書(doc/go_spec.html)におけるビットクリア演算子(&^)の記述を修正し、その名称をより明確にするものです。具体的には、この演算子が「bitwise nand」ではなく「bit clear (and not)」であることを明記し、関連するコード例の表記も修正しています。

コミット

commit 307ec219322668cf93b4bc2085bea5f201147572
Author: Rob Pike <r@golang.org>
Date:   Thu Mar 12 15:53:56 2009 -0700

    what is the name for "&^". let's go with bit clear (and not)
    
    R=rsc
    DELTA=14  (0 added, 0 deleted, 14 changed)
    OCL=26159
    CL=26206

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/307ec219322668cf93b4bc2085bea5f201147572

元コミット内容

what is the name for "&^". let's go with bit clear (and not)

R=rsc
DELTA=14  (0 added, 0 deleted, 14 changed)
OCL=26159
CL=26206

変更の背景

Go言語の初期開発段階において、ビット演算子&^の正式名称とその意味合いについて議論がありました。この演算子は、一般的に「ビットクリア」または「AND NOT」として知られる操作を実行します。しかし、一部の文脈では「NAND(Not AND)」と混同される可能性がありました。NANDは論理演算子であり、ビットごとのNANDは~(A & B)と表現されるため、A &^ Bとは異なる動作をします。

このコミットは、Go言語の公式仕様書であるdoc/go_spec.htmlにおいて、この演算子の名称を「bitwise nand」から「bit clear (and not)」へと明確に修正することを目的としています。これにより、Go言語のユーザーや学習者がこの演算子の正確な意味と用途を誤解なく理解できるようになります。また、関連するコード例の表記も、HTMLエンティティの使用を避けてより直接的な表現に修正されています。

前提知識の解説

ビット演算子

ビット演算子は、数値のバイナリ表現(ビット列)に対して直接操作を行う演算子です。Go言語を含む多くのプログラミング言語でサポートされており、低レベルのデータ操作、フラグ管理、パフォーマンス最適化などに利用されます。

Go言語における主なビット演算子は以下の通りです。

  • & (AND): 両方のビットが1の場合にのみ1を返します。
  • | (OR): 少なくとも一方のビットが1の場合に1を返します。
  • ^ (XOR): いずれか一方のビットが1で、もう一方が0の場合に1を返します(排他的論理和)。
  • &^ (AND NOT / ビットクリア): 左オペランドのビットが1であり、かつ右オペランドの対応するビットが0の場合にのみ1を返します。これは、左オペランドから右オペランドのビットが1である部分を「クリア(0にする)」操作に相当します。
  • << (左シフト): ビットを左に指定された数だけ移動させます。右側には0が埋められます。
  • >> (右シフト): ビットを右に指定された数だけ移動させます。符号付き整数では符号ビットが保持される(算術右シフト)か、0が埋められる(論理右シフト)かは言語やデータ型によりますが、Goでは算術右シフトです。

&^ (ビットクリア / AND NOT) 演算子

&^演算子は、x &^ y の形式で使用されます。これは、x AND (NOT y) と等価です。つまり、y の対応するビットが 1 であれば x のビットを 0 にし、y の対応するビットが 0 であれば x のビットをそのままにします。

例: x = 10 (バイナリ: 1010) y = 03 (バイナリ: 0011)

NOT y は、y のビットを反転させたものです。ただし、これは通常、オペランドの型(ビット幅)に依存します。Go言語では、&^はビットごとのAND NOTとして機能します。

x &^ y の計算: x: 1010 y: 0011

各ビットを比較します。

  • 最上位ビット: xは1, yは0。yが0なのでxのビットをそのまま -> 1
  • 次のビット: xは0, yは0。yが0なのでxのビットをそのまま -> 0
  • 次のビット: xは1, yは1。yが1なのでxのビットを0にする -> 0
  • 最下位ビット: xは0, yは1。yが1なのでxのビットを0にする -> 0

結果: 1000 (10進数で8)

これは、xからyでセットされているビットをクリアする操作と考えることができます。

HTMLエンティティ

HTMLエンティティは、HTMLドキュメント内で特殊文字(例: <>&)や表示できない文字(例: 非改行スペース)を表現するために使用されるコードです。例えば、<&lt;>&gt;&&amp;と記述されます。このコミットでは、1&lt;&lt;nのようなHTMLエンティティ表記を、より直接的な1<<nに修正しています。これは、コード例の可読性を向上させるための変更です。

技術的詳細

このコミットの主要な変更点は、Go言語の仕様書(doc/go_spec.html)におけるビットクリア演算子&^の記述の正確性を高めることです。

  1. 演算子名称の修正:

    • 変更前: &^ bitwise nand integers
    • 変更後: &^ bit clear (and not) integers この変更により、&^がビットごとのNANDではなく、ビットクリア(AND NOT)操作であることを明確にしています。NANDは論理演算の文脈で使われることが多く、ビットごとのNANDは~(A & B)と表現されるため、A &^ Bとは異なる意味を持ちます。Goの&^は、A & (^B)、つまりAからBでセットされているビットをマスクアウトする(クリアする)操作です。
  2. コード例の表記修正:

    • 変更前: i &^= (1&lt;&lt;n)
    • 変更後: i &^= 1&lt;&lt;n これは、HTMLエンティティである&lt;を実際の<記号に置き換えることで、コード例の可読性を向上させています。1<<nは、1をnビット左シフトする操作であり、特定のビットをセットするためのマスクを生成する際によく用いられます。この修正は、仕様書内のコードスニペットがより自然なGoコードとして表示されるようにするためのものです。

これらの変更は、Go言語の仕様の正確性と明瞭性を高める上で重要です。特に、ビット演算子は低レベルの操作に関わるため、その定義が曖昧であると誤解やバグの原因となる可能性があります。

コアとなるコードの変更箇所

--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -2497,19 +2497,19 @@ to strings; all other arithmetic operators apply to integers only.
 </p>
 
 <pre class="grammar">
-+    sum             integers, floats, strings
--    difference      integers, floats
-*    product         integers, floats
-/    quotient        integers, floats
-%    remainder       integers
++    sum                    integers, floats, strings
+-    difference             integers, floats
+*    product                integers, floats
+/    quotient               integers, floats
+%    remainder              integers
 
-&    bitwise and     integers
-|    bitwise or      integers
-^    bitwise xor     integers
-&^   bitwise nand    integers
+&    bitwise and            integers
+|    bitwise or             integers
+^    bitwise xor            integers
+&^   bit clear (and not)    integers
 
-<<   left shift      integer << unsigned integer
->>   right shift     integer >> unsigned integer
+<<   left shift             integer << unsigned integer
+>>   right shift            integer >> unsigned integer
 </pre>
 
 <p>
@@ -3023,7 +3023,7 @@ x = 1
 *p = f()
 a[i] = 23
 k = <-ch
-i &^= (1&lt;&lt;n)
+i &^= 1&lt;&lt;n
 </pre>
 
 <p>

コアとなるコードの解説

このコミットは、doc/go_spec.htmlファイル内の2つの主要なセクションを変更しています。

  1. 演算子一覧の修正 (行 2497付近): pre class="grammar"タグで囲まれたGo言語の演算子一覧において、&^演算子の説明が変更されています。

    • -&^ bitwise nand integers という行が削除され、
    • +&^ bit clear (and not) integers という行が追加されました。 これにより、&^演算子の正式な意味が「ビットクリア(AND NOT)」であることが明確に示されています。また、他の演算子(+, -, *, /, %, &, |, ^, <<, >>)の説明も、アラインメントを整えるためにスペースが追加されています。これは機能的な変更ではなく、整形上の改善です。
  2. コード例の修正 (行 3023付近): preタグで囲まれたコード例のセクションにおいて、複合代入演算子&^=の使用例が修正されています。

    • -i &^= (1&lt;&lt;n) という行が削除され、
    • +i &^= 1&lt;&lt;n という行が追加されました。 この変更は、HTMLエンティティである&lt;&gt;を、それぞれ実際の<>記号に置き換えることで、コードスニペットの可読性を向上させています。1<<nはGoのコードとしてより自然な表記であり、HTMLエンエンティティはブラウザでの表示を目的としたもので、コードの例としては直接的な記号が望ましいです。

これらの変更は、Go言語の仕様書が提供する情報の正確性と、コード例の表現の明瞭性を高めることに貢献しています。

関連リンク

参考にした情報源リンク

  • Go言語の公式リポジトリ: https://github.com/golang/go
  • Go言語のビット演算子に関する議論(Stack Overflowなど、一般的なプログラミングコミュニティでの情報)
  • HTMLエンティティに関する一般的な情報(MDN Web Docsなど)
  • Go言語の初期開発に関する情報(Goブログ、Goの設計に関する論文など)