[インデックス 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ドキュメント内で特殊文字(例: <
、>
、&
)や表示できない文字(例: 非改行スペース)を表現するために使用されるコードです。例えば、<
は<
、>
は>
、&
は&
と記述されます。このコミットでは、1<<n
のようなHTMLエンティティ表記を、より直接的な1<<n
に修正しています。これは、コード例の可読性を向上させるための変更です。
技術的詳細
このコミットの主要な変更点は、Go言語の仕様書(doc/go_spec.html
)におけるビットクリア演算子&^
の記述の正確性を高めることです。
-
演算子名称の修正:
- 変更前:
&^ bitwise nand integers
- 変更後:
&^ bit clear (and not) integers
この変更により、&^
がビットごとのNANDではなく、ビットクリア(AND NOT)操作であることを明確にしています。NANDは論理演算の文脈で使われることが多く、ビットごとのNANDは~(A & B)
と表現されるため、A &^ B
とは異なる意味を持ちます。Goの&^
は、A & (^B)
、つまりA
からB
でセットされているビットをマスクアウトする(クリアする)操作です。
- 変更前:
-
コード例の表記修正:
- 変更前:
i &^= (1<<n)
- 変更後:
i &^= 1<<n
これは、HTMLエンティティである<
を実際の<
記号に置き換えることで、コード例の可読性を向上させています。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<<n)
+i &^= 1<<n
</pre>
<p>
コアとなるコードの解説
このコミットは、doc/go_spec.html
ファイル内の2つの主要なセクションを変更しています。
-
演算子一覧の修正 (行 2497付近):
pre class="grammar"
タグで囲まれたGo言語の演算子一覧において、&^
演算子の説明が変更されています。-&^ bitwise nand integers
という行が削除され、+&^ bit clear (and not) integers
という行が追加されました。 これにより、&^
演算子の正式な意味が「ビットクリア(AND NOT)」であることが明確に示されています。また、他の演算子(+
,-
,*
,/
,%
,&
,|
,^
,<<
,>>
)の説明も、アラインメントを整えるためにスペースが追加されています。これは機能的な変更ではなく、整形上の改善です。
-
コード例の修正 (行 3023付近):
pre
タグで囲まれたコード例のセクションにおいて、複合代入演算子&^=
の使用例が修正されています。-i &^= (1<<n)
という行が削除され、+i &^= 1<<n
という行が追加されました。 この変更は、HTMLエンティティである<
と>
を、それぞれ実際の<
と>
記号に置き換えることで、コードスニペットの可読性を向上させています。1<<n
はGoのコードとしてより自然な表記であり、HTMLエンエンティティはブラウザでの表示を目的としたもので、コードの例としては直接的な記号が望ましいです。
これらの変更は、Go言語の仕様書が提供する情報の正確性と、コード例の表現の明瞭性を高めることに貢献しています。
関連リンク
- Go言語の仕様書: https://go.dev/ref/spec (このコミットが修正したドキュメントの最新版)
- Go言語のビット演算子に関する公式ドキュメント(最新版の仕様書内): https://go.dev/ref/spec#Arithmetic_operators
参考にした情報源リンク
- Go言語の公式リポジトリ: https://github.com/golang/go
- Go言語のビット演算子に関する議論(Stack Overflowなど、一般的なプログラミングコミュニティでの情報)
- HTMLエンティティに関する一般的な情報(MDN Web Docsなど)
- Go言語の初期開発に関する情報(Goブログ、Goの設計に関する論文など)