質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

3回答

17963閲覧

Go言語、「>>」の意味。

afroscript

総合スコア148

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

1グッド

2クリップ

投稿2015/10/25 09:22

編集2015/10/25 15:24

普段はPHPとJSを少し書いている初心者です。

おそらくプログラミングのすごく初歩的なとこに関する質問で恐縮なのです。。。

Tour of GoでGo言語を勉強しているのですが、
16項目目にでてくる「<<」「>>」の意味って何なのでしょうか??

Small=2と出力されるのですが、なぜ2になるのでしょうか?

ご教示頂けますと幸いでございます。

Go

1package main 2 3import "fmt" 4 5const ( 6 Big = 1 << 100 ←ここと、 7 Small = Big >> 99 ←ここです!! 8) 9 10func needInt(x int) int { 11 return x*10 + 1 12} 13 14func needFloat(x float64) float64 { 15 return x * 0.1 16} 17 18func main() { 19 fmt.Println(Small) 20 fmt.Println(needInt(Small)) 21 fmt.Println(needFloat(Small)) 22 fmt.Println(needFloat(Big)) 23}
marronnier👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

「>>」と「<<」はビット演算子と呼ばれているもので、数値を二進数であらわしたときに右にずらしたり左にずらしたりするものです。

たとえば十進数の5を二進数であらわすと101になります。
そこで左にずらしてみます。
101 << 1 → 1010(二進数)で十進数だと10です。
101 << 3 → 101000(二進数)で十進数だと40です。

今度は右にずらしてみます。
101 >> 1 → 10(二進数)で十進数だと2です。
101 >> 2 → 1(二進数)で十進数でも1です。

そして元の質問に戻ってみると

Big = 1 << 100 Small = Big >> 99

Smallは1を100左にずらして99右にずらしたことになるので、最終的に左に1ずらした事になります。
なので 1 << 1 → 10(二進数)で十進数だと2になります。

投稿2015/10/25 10:14

shiena

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

afroscript

2015/10/25 15:36

shienaさん 大変ご丁寧な回答、誠にありがとうございます!!! ビット演算子というのですね!! やっと理解できました!!
afroscript

2015/10/28 08:47

あ…!本当ですね…!! PHPとJSはちょっと勉強しておきながら、恐縮です…!! ありがとうございます!!もっと勉強します!!
guest

0

整数に対してビットシフト演算を行うものです。

1 << 100してからBig >> 99すると、1 << 1したのと同じになりますので、 2になります。

2進数で表すと、こうなります。
※ビットが100だと大きすぎるので、それぞれマイナス50しています。

このコードを Playground で実行 →http://play.golang.org/p/k6u-24vjtG

lang

1package main 2 3import "fmt" 4 5const ( 6 One int64 = 1 7 Big = One << 50 8 Small = Big >> 49 9) 10 11func main() { 12 fmt.Printf("One =%051b\n", One) 13 fmt.Printf("Big =%051b\n", Big) 14 fmt.Printf("Small=%051b\n", Small) 15}

実行結果

One =000000000000000000000000000000000000000000000000001 Big =100000000000000000000000000000000000000000000000000 Small=000000000000000000000000000000000000000000000000010

参考リンク:
Goプログラミング言語仕様 - golang.jp
http://golang.jp/go_spec

投稿2015/10/25 10:16

編集2015/10/25 11:00
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

afroscript

2015/10/25 15:40

argiusさん ご回答、誠にありがとうございます!! 実行例と実行結果まであり、大変分かりやすかったです! とてもよく理解できました!! (本当はこちらにもベストアンサーをつけたいのですが、ひとつの回答にしかつけられないようなので、今回は先に頂いたほうにつけさせていただきました…。申し訳ないです。。。)
argius

2015/10/26 00:36 編集

ベストアンサーについては、どうぞお気遣いなく。 御返事ついでに、いくつか補足を。 ・リンクを貼ったgolang.jpですが、貼っておいて何ですけど、最近は(2年程)更新されていないようです。最新の情報を得るには、英語版の方(golang.org)をご覧ください。 ・このビットシフト演算子は、JavaScriptでも同様の機能があります。(って、 shienaさんが既に書いていました...PHPもなんですね。)さらに言うと、JavaなどC言語に近い言語はたいてい同じビットシフト演算子を持っています。
afroscript

2015/10/28 08:44

お返事と補足、誠にありがとうございます! >・リンクを貼ったgolang.jpですが、貼っておいて何ですけど、最近は(2年程)更新されていないようです。最新の情報を得るには、英語版の方(golang.org)をご覧ください。 そうなんですね…!!英語、まだ苦手意識あるのですが(笑)、頑張ってみます!! >・このビットシフト演算子は、JavaScriptでも同様の機能があります。(って、 shienaさんが既に書いていました...PHPもなんですね。)さらに言うと、JavaなどC言語に近い言語はたいてい同じビットシフト演算子を持っています。 なるほど!いろんな言語で使われているものなのですね! そういえば昔大学時代でC言語やってた時に見たことがあるような…!! 当時真面目に受けてなかったのであやふやですが…(汗) 隙を見て、CやJavaも改めて触ってみます!!
guest

0

Tour of Go で不明な点がでてきたら、次を参照するとよいです。

このページ中で "<<" を検索してみてください。

...
シフト演算子は、左オペランドを右オペランドで指定されたシフト数だけシフトします。実装としては、シフトの左オペランドが、符号あり整数のとき算術シフト、符号なし整数のときは論理シフトが使われます。シフト数には上限がありません。シフト数nでシフトを行うとき、シフト演算は左オペランドをn回繰り返して、シフト数1でシフトしたように振舞います。シフト演算の結果として、x << 1 はx*2と同じであり、x >> 1は x/2を負の無限大の値に近づくように切り捨てた値と同じになります。
...

この説明ではわからなければ、"シフト演算子" などで google 検索すれば、さらに情報が得られるはずです。
(シフト演算子とは go 言語に限らず、他のプログラム言語でも用いられる一般的な用語です)

投稿2015/10/25 21:41

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

afroscript

2015/10/26 00:32

katoyさん ご回答、誠にありがとうございいます!! 調べ方まで教えていただけるのは大変助かります!! http://golang.jp/go_spec にすべて書いてあったのですね…!! もっと読み込んでみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問