3

私はhttp://tour.golang.orgで「GOのツアー」をフォローしていました。表15には、私が理解できないコードがいくつかあります。次の構文で2つの定数を定義します。

const (
    Big = 1<<100
    Small = Big>>99
)

そして、それが何を意味するのかは私にはまったくわかりません。コードを変更して別の値で実行し、変更を記録しようとしましたが、そこで何が起こっているのか理解できませんでした。

次に、テーブル24でその演算子を再度使用します。次の構文で変数を定義します。

MaxInt uint64 = 1<<64 - 1

そして、変数を出力すると、次のように出力されます。

uint64(18446744073709551615)

タイプはどこですかuint64。しかし、どこ18446744073709551615から来たのか理解できません。

4

4 に答える 4

11

これらはGoのビット単位のシフト演算子です。

これらがCでどのように機能するかについての良い説明があります(いくつかの言語で同じように機能します)。基本的1<<64 - 1に2^64 -1=18446744073709551615に対応します。

このように考えてください。10進数で、001(10 ^ 0)から開始し、1を左にシフトすると、010(10 ^ 1)になります。もう一度シフトすると、100で終わります。これは10^2です。したがって、左にシフトすることは、シフトする回数の10倍に相当します。

2進数でも同じですが、基数2では、1 <<64は264倍(つまり2 ^ 64)を掛けることを意味します。

于 2012-09-14T13:30:15.750 に答える
7

これは、Cファミリのすべての言語と同じです。少しシフトしています。

http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shiftsを参照してください

この演算は通常、符号なし整数を2の累乗で乗算または除算するために使用されます。

b := a >> 1 // divides by 2

1<<100単純です2^100(それは大きいです)。

1<<64-1は2⁶⁴-1であり、これは64ビットで表現できる最大の整数です(ちなみに1<<64、64ビットintとして表現することはできません。表15のポイントは、Goで数値定数で表現できることを示すことです。 )。

于 2012-09-14T13:29:09.250 に答える
1

それは論理シフトです:

オペランドのすべてのビットは、指定された数のビット位置に移動されるだけで、空のビット位置は通常ゼロで埋められます。

Go演算子

<<   left shift             integer << unsigned integer
>>   right shift            integer >> unsigned integer
于 2012-09-14T13:30:34.597 に答える
1

>>と<<は論理シフト演算です。あなたはここでそれらについてもっと見ることができます:

http://en.wikipedia.org/wiki/Logical_shift

また、すべてのGo演算子をWebページで確認できます

于 2012-09-14T13:33:25.487 に答える