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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

7回答

2544閲覧

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

Eltk

総合スコア51

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/06/06 00:25

編集2019/06/06 00:34

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

前提・実現したいこと

今、課題(解答なし)を解いておりまして、全然わからない問題が出てきまして、こちらで質問させていただきました。
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/ツールのバージョンなど)

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

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

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

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

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

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

fuzzball

2019/06/06 00:31

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

2019/06/06 00:32

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

2019/06/06 00:35 編集

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

2019/06/06 00:56

すみませんでした。。
guest

回答7

0

ベストアンサー

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

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

投稿2019/06/06 00:46

otn

総合スコア84533

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

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

Eltk

2019/06/06 00:51

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

0

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

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

投稿2019/06/06 00:45

maisumakun

総合スコア145183

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

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

Eltk

2019/06/06 00:56

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

2019/06/06 00:59

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

0

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

java

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

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

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

投稿2019/06/06 00:39

編集2019/06/06 00:41
tetsunosuke

総合スコア1292

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

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

Eltk

2019/06/06 00:55

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

0

0b1が16進数だと思い、

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

投稿2019/06/06 00:38

y_waiwai

総合スコア87774

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

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

fuzzball

2019/06/06 00:48

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

2019/06/06 00:49

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

2019/06/06 00:53

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

0

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

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

投稿2019/06/06 00:37

HiroshiWatanabe

総合スコア2160

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

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

Eltk

2019/06/06 00:52

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

0

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

投稿2019/06/06 00:34

sumagimo

総合スコア16

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

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

Eltk

2019/06/06 00:37

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

2019/06/06 00:39

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

2019/06/06 00:45

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

2019/06/06 00:52

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

0

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

投稿2019/06/06 00:33

ruei

総合スコア284

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

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

Eltk

2019/06/06 00:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問