質問: ・練習問題の内容 10進数の整数(10)10は、int型のビット列で表すと (00000000000000000000000000001010)2 のように0と1を並べた表記になる。 この時一番右の1は (00000000000000000000000000000010)2 であり、10進数で表すと、(2)10となる。また、一番右の1で左へ塗りつぶすと (11111111111111111111111111111110)2 となり、10 進数で表すと (−2)10 となる。 そこで、int 型の整数を入力するとその整数をビット列で表したときの一番右の 1 と、一番 右の 1 で左に塗りつぶしたときの値の、2 つを10進数で表示するプログラムを書きなさい。 どこがわからないのかと言うと 『10進数の整数(10)10は、int型のビット列で表すと (00000000000000000000000000001010)2 のように0と1を並べた表記になる。』 ↑この節はわかります。 『この時一番右の1は』 ↑一番右の1とはどれを指しているのでしょうか。追記:恐らく解決しました。(文字通り()内部の一番右の1のことのようでした) 『(00000000000000000000000000000010)2 であり、10進数で表すと、(2)10となる。また、一番右の1で左へ塗りつぶすと』 ↑左へ塗りつぶすとは、どういう意味なのでしょうか。追記:恐らく解決しました。(1で左シフト?のことだろうと気づきました。) 『(11111111111111111111111111111110)2 となり、10 進数で表すと (−2)10 となる。』 ↑(-2)10となるのはなぜでしょうか。追記:恐らく解決しました。(一番左のビットが1のときは、マイナスになるようです。) 解決したいことは 上記に記述した疑問点と 追記:上記の疑問点は解決しました。 『そこで、int 型の整数を入力するとその整数をビット列で表したときの一番右の 1 と、一番 右の 1 で左に塗りつぶしたときの値の、2 つを10進数で表示するプログラムを書きなさい。』 このプログラムを書く際にあたって ビット演算子を使え、このサイトを見ろ、などの僅かなヒントでもいいので、ヒントになりそうなことを教えてほしいです。 よろしくお願い致します。 追記:int 型の整数を入力するとその整数をビット列で表したときの一番右の 1 と、一番 右の 1 で左に塗りつぶしたときの値の、2 つを10進数で表示するプログラムを書きなさい。 とのことですが、ここまでで「整数を入力するため、Scannerをインポート」「シフト演算子」「右シフト?左シフト?」「ループ」「奇数になったらループ処理終了」 ざっくりと検討が付きました。
回答: 塗りつぶすっていう意味が全部1にするってことなのかな・・・ 奇数になったらループ処理終了・・・・というのはよくわかりませんが、 ``` import java.util.Scanner; class Test{ public static void main(String args[]) { Scanner sc = new Scanner(System.in); int _inputValue = sc.nextInt(); int i = 0; for( ; i < Integer.SIZE; i++) { if((0x1 & _inputValue) != 0x0) { break; } _inputValue = _inputValue >> 1; } int _ans = 0x0; for( ; i < Integer.SIZE; i++) { _ans = _ans | (0x1 << i); } System.out.println(_ans); } } ``` こういうことかしら