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

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

ただいまの
回答率

89.65%

ビット演算についてのご質問

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 523

takumi0610

score 23

初心者です。
以下のことで困っております。
どなたか教えていただければ幸いです。
どうぞよろしくお願いいたします。

前提・実現したいこと

今、課題(解答なし)を解いておりまして、全然わからない問題が出てきまして、こちらで質問させていただきました。
Javaの課題として与えられておりますが、質問場所が間違えておればご指摘いただければと思います。

■問題
int型変数ixを宣言し、0b1を代入する。
ビットシフト<<1を32回繰り返し値が下記になることを確認する。
31回目でマイナスの値になり、32回目でゼロになる。
その理由を考えなさい。

試したこと

0b1が16進数だと思い、
10進数(0|11|1)に直し、
2進数(0000|1011|0001)に直してみました。(ここまで合っているのかもわかっておりません)
ただ、今12ビットの状態になっており、そこから32ビットも左にシフトすることができないのではないかと思いまして、
詰まりました。
また、<<1が左に1ビット分移動するという解釈で合っているのかもわかっておりません。

(修正)
0bが2進数をあらわすことを教えていただきましたので、0b1が「2進数で1をあらわす」ということまでわかったのですが、
その先がわかりません。

補足情報(FW/ツールのバージョンなど)

もし必要な情報があれば教えていただきたく思います。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2019/06/06 09:31

    接頭辞の 0b は2進数です。

    キャンセル

  • takumi0610

    2019/06/06 09:32

    0bで2進数を表すのですね。
    ということは2進数で1ということでしょうか。。
    ますますわからなくなってきました。

    キャンセル

  • fuzzball

    2019/06/06 09:35 編集

    >> <<1が左に1ビット分移動するという解釈で合っているのかもわかっておりません
    なぜ調べないのでしょうか?

    キャンセル

  • takumi0610

    2019/06/06 09:56

    すみませんでした。。

    キャンセル

回答 7

+1

そこから32ビットも左にシフトすることができないのではないかと思いまして、

Javaの左シフト演算子は、オーバーフローした分は単に無視されるので、1ビットずつ何度もシフトして、全ビットを追い出すことは可能です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:56

    はみだした1は無視して良いんですね。
    解決しました!ありがとうございます。

    キャンセル

  • 2019/06/06 09:59

    高級言語で見かけることはあまりありませんが、「はみ出した分は下位ビットに戻す」演算もCPUに実装されている例があり、そちらは「ローテート」と呼ばれます。

    キャンセル

checkベストアンサー

0

Javaのint型は32ビットなので、1をint型変数に入れると、
0000 0000 0000 0000 0000 0000 0000 0001
になります。途中の空白は桁の数えやすさのために入れています。

これで、シフトするイメージが湧きませんか?
あとは、2の補数表現というのを学んでいるはずなので、思い出してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:51

    31回目で、
    1000 0000 0000 0000 0000 0000 0000 0000
    となり(一番左が1なのでマイナス)
    32回目で
    1 0000 0000 0000 0000 0000 0000 0000 0000
    となり、一番左の1ははみ出し(除外され)、残りは0なので、0が答えということですね!
    ありがとうございます!
    一番、わかりやすかったです!

    キャンセル

0

<<1が1ビット左へのシフトであっています。
32bitを超過したビットは消えてなくなります。
32回目で0になるというのはそういうことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:51

    一番早くご解答いただき、ありがとうございました!

    キャンセル

0

javaは専門外ですが、0b1ってBCDなのでしょうか?
0b1はMSB立っているので32ビットシフトで問題の通りになると思います。
的外れだったらすいません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:37

    すみません。BCDやMSB立っているという意味が全然わかっておりません。。

    キャンセル

  • 2019/06/06 09:39

    失礼しました。
    表記は0b1で "1"ですね。
    MSBは最上位ビットという意味です。
    こちらもMSBが立っているというのは勘違いでした。

    キャンセル

  • 2019/06/06 09:45

    00000000000000000000000000000001 が元の値ってことになります。
    1が左に移動していくということでわかるのではないでしょうか。

    キャンセル

  • 2019/06/06 09:52

    MSBが最上位ビットというものなのですね。勉強になりました。
    ありがとうございます!

    キャンセル

0

0b1が16進数だと思い、

0b というのは2進数を表してます
なので、これは、0x01 のことですね
一般的に、intという変数は32ビットの幅を持ってますんで、
0x00000001  を31回左シフトするとどうなるのか、また、32回するとどうなるのかを考えましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:48

    「一般的に」ではなく32bit固定ですね。

    キャンセル

  • 2019/06/06 09:49

    Javaでは変数の幅が決まっていますね。

    キャンセル

  • 2019/06/06 09:53

    obが2進数とわかっておりませんでした。。
    解決しました!ありがとうございます!

    キャンセル

0

回答を書くのもアレなので・・・

class Main {
    public static void main(String[] args) {
        int ix = 0b1; // 2進数表記でそのままintに代入できる
        System.out.println(ix);  // 出力は、 1
        System.out.println(ix<<1); // 1を左へ1つシフトすると?
    }
}

追記修正依頼で書かれていますが、0b1がそのままで2進数なので上記のようになりますよね。

で int型の1を2進数の0と1で表記するとどうなりますか? (000...1になります。さて0は何個でしょうか)
それを左へ1ビットシフトすると、(000....10) となり、出力すると上記コードの実行結果のように2になります。31回め、32回目はそれぞれどうなり、なぜマイナスになるのか考えましょう、という問題なのだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:55

    コードまで書いていただきてありがとうございました!
    実行するとそれぞれ1,2となりました。
    System.out.printlnの中に、ix<<1という書き方ができるんですね!
    勉強になりました!
    ありがとうございます!

    キャンセル

-1

>0b1が16進数だと思い、

16進数ではなく2進数ですね。
"1"と書けば10進数ですが
"01" と書けば8進数(0で始まる数値)
"0x1"と書けば16進数(0xもしくは0Xで始まる数値)
"0b1"と書けば2進数(0bもしくは0Bで始まる数値)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/06 09:52

    書き方によって進数が分かれるんですね。
    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る