エンジニア成長日記 swaponQ

コンピュータサイエンス専攻の一般人のブログです。

新・明解 Java 入門 演習 7-11, 7-12, 7-13, 7-14 解答

Hello, Terminal!swaponQです!

今回は演習 7-11, 7-12, 7-13, 7-14 に取り組んでいこうと思います。

  • 演習 7-11

整数を左右にシフトした値が、2のべき乗での乗算や除算と等しくなることを確認するプログラムを作成せよ。


ソースコード

import java.util.Scanner;

class ex07_11{
  static void printBits(int x) {
    for (int i = 31; i >= 0; i--) {
      System.out.print(((x >>> i & 1) == 1) ? '1' : '0');
    }
  }
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    System.out.print("整数:");
    int x = stdIn.nextInt();
    System.out.print("シフトするビット数:");
    int n = stdIn.nextInt();
    System.out.print("整数    = ");
    printBits(x);
    System.out.print("\nx <<  n = ");
    printBits(x << n);
    System.out.print("\nx >>  n = ");
    printBits(x >> n);
    int y = x;
    int z = x;
    for(int i = 0; i < n; i++) {
      y = y * 2;
    }
    System.out.print("\nxの2のべき乗での乗算:");
    printBits(y);
    for(int i = 0; i < n; i++){
      z = z / 2;
    }
    System.out.print("\nxの2のべき乗での除算:");
    printBits(z);
    System.out.println();
  }
}

・実行結果

整数:5
シフトするビット数:3
整数    = 00000000000000000000000000000101
x <<  n = 00000000000000000000000000101000
x >>  n = 00000000000000000000000000000000
xの2のべき乗での乗算:00000000000000000000000000101000
xの2のべき乗での除算:00000000000000000000000000000000
  • 演習 7-12

整数xを右にnビット回転した値を返すメソッドrRotateと、左にnビット回転した値を返すメソッドlrotateを作成せよ。

ソースコード

import java.util.Scanner;

class ex07_12 {
  static void printBits(int x) {
    for (int i = 31; i >= 0; i--){
      System.out.print(((x >>> i & 1) == 1) ? '1' : '0');
    }
  }
  static int rRotate(int x,int n){
    int y = 0;
    y = x >>> n;
    x = x << 32 - n;
    x = y | x;
    return x;
  }
  static int lRotate(int x,int n){
    int y = 0;
    y = x << n;
    x = x >>> 32 - n;
    x = y | x;
    return x;
  }
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    System.out.print("整数xをを右にnビット回転します。\n整数x:");
    int x = stdIn.nextInt();
    System.out.print("ビット回転する数:");
    int n = stdIn.nextInt();
    System.out.print(  "整数x            = ");
    printBits(x);
    System.out.println();
    System.out.print("ビット回転した数 = ");
    printBits(rRotate(x,n));
    System.out.println();
    System.out.print("整数xをを左にnビット回転します。\n整数y:");
    int y = stdIn.nextInt();
    System.out.print("ビット回転する数:");
    int t = stdIn.nextInt();
    System.out.print(  "整数y            = ");
    printBits(y);
    System.out.println();
    System.out.print("ビット回転した数 = ");
    printBits(lRotate(y,t));
    System.out.println();
  }
}

・実行結果

整数xをを右にnビット回転します。
整数x:5
ビット回転する数:3
整数x            = 00000000000000000000000000000101
ビット回転した数 = 10100000000000000000000000000000
整数yをを左にnビット回転します。
整数y:6
ビット回転する数:4
整数y            = 00000000000000000000000000000110
ビット回転した数 = 00000000000000000000000001100000
  • 演習 7-13

整数xのposビット目を、1にした値を返すメソッドset、0にした値を返すメソッドreset、反転した値を返すメソッドinverseを作成せよ。

ソースコード

import java.util.Scanner;

class ex07_13 {
  static void printBits(int x) {
    for (int i = 31; i >= 0; i--)
    System.out.print(((x >>> i & 1) == 1) ? '1' : '0');
  }
  static int set(int x,int pos){
    int y = 1;
    y = y << pos;
    x = y | x;
    return x;
  }
  static int reset(int x,int pos){
    int y = 1;
    y = y << pos;
    x = ~x;
    x = y | x;
    x = ~x;
    return x;
  }
  static int inverse(int x,int pos){
    int y = 1;
    y = y << pos;
    x = y ^ x;
    return x;
  }
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    System.out.print("整数xのposビット目を1にした値を返します。\n整数x:");
    int x = stdIn.nextInt();
    System.out.print("整数pos:");
    int n = stdIn.nextInt();
    System.out.print("整数x       = ");
    printBits(x);
    System.out.println();
    System.out.print("setの返却値 = ");
    printBits(set(x,n));
    System.out.println();
    System.out.print("整数yのposビット目を0にした値を返します。\n整数x:");
    int y = stdIn.nextInt();
    System.out.print("整数pos:");
    int m = stdIn.nextInt();
    System.out.print("整数y         = ");
    printBits(y);
    System.out.println();
    System.out.print("resetの返却値 = ");
    printBits(reset(y,m));
    System.out.println();
    System.out.print("整数zのposビット目を反転した値を返します。\n整数z:");
    int z = stdIn.nextInt();
    System.out.print("整数pos:");
    int l = stdIn.nextInt();
    System.out.print("整数z           = ");
    printBits(z);
    System.out.println();
    System.out.print("inverseの返却値 = ");
    printBits(inverse(z,l));
    System.out.println();
  }
}

・実行結果

整数xのposビット目を1にした値を返します。
整数x:6
整数pos:3
整数x       = 00000000000000000000000000000110
setの返却値 = 00000000000000000000000000001110
整数yのposビット目を0にした値を返します。
整数x:6
整数pos:3
整数y         = 00000000000000000000000000000110
resetの返却値 = 00000000000000000000000000000110
整数zのposビット目を反転した値を返します。
整数z:6
整数pos:3
整数z           = 00000000000000000000000000000110
inverseの返却値 = 00000000000000000000000000001110
  • 演習 7-14

整数xのposビット目を最下位として連続するnビットを、1にした値を返すメソッドsetN、0にした値を返すメソッドresetN、反転した値を返すメソッドinverseNを作成せよ。

ソースコード

import java.util.Scanner;

class ex07_14{
  static void printBits(int x) {
    for (int i = 31; i >= 0; i--)
    System.out.print(((x >>> i & 1) == 1) ? '1' : '0');
  }
  static int setN(int x,int pos){
    int y = 1;
    y = y << pos;
    int i = 0;
    while(i < 32 - pos) {
      x = y | x;
      i++;
      y = y << 1;
    }
    return x;
  }
  static int resetN(int x,int pos){
    int y = 1;
    y = y << pos;
    int i = 0;
    while(i < 32 - pos) {
      x = ~x;
      x = y | x;
      x = ~x;
      i++;
      y = y << 1;
    }
    return x;
  }
  static int inverseN(int x,int pos){
    int y = 1;
    y = y << pos;
    int i = 0;
    while(i < 32 - pos) {
      x = y ^ x;
      i++;
      y = y << 1;
    }
    return x;
  }
  public static void main(String[] args) {
    Scanner stdIn = new Scanner(System.in);
    System.out.print("整数xのposビット目を最下位として連続するn個のビットを1にした値を返します。\n整数x:");
    int x = stdIn.nextInt();
    System.out.print("整数pos:");
    int n = stdIn.nextInt();
    System.out.print("整数x        = ");
    printBits(x);
    System.out.println();
    System.out.print("setNの返却値 = ");
    printBits(setN(x,n));
    System.out.println();
    System.out.print("整数yのposビット目を最下位として連続するn個のビットを0にした値を返します。\n整数y:");
    int y = stdIn.nextInt();
    System.out.print("整数pos:");
    int m = stdIn.nextInt();
    System.out.print("整数y          = ");
    printBits(y);
    System.out.println();
    System.out.print("resetNの返却値 = ");
    printBits(resetN(y,m));
    System.out.println();
    System.out.print("整数zのposビット目を最下位として連続するn個のビットを反転した値を返します。\n整数z:");
    int z = stdIn.nextInt();
    System.out.print("整数pos:");
    int l = stdIn.nextInt();
    System.out.print("整数z            = ");
    printBits(z);
    System.out.println();
    System.out.print("inverseNの返却値 = ");
    printBits(inverseN(z,l));
    System.out.println();
  }
}

・実行結果

整数xのposビット目を最下位として連続するn個のビットを1にした値を返します。
整数x:6
整数pos:4
整数x        = 00000000000000000000000000000110
setNの返却値 = 11111111111111111111111111110110
整数yのposビット目を最下位として連続するn個のビットを0にした値を返します。
整数y:6
整数pos:4
整数y          = 00000000000000000000000000000110
resetNの返却値 = 00000000000000000000000000000110
整数zのposビット目を最下位として連続するn個のビットを反転した値を返します。
整数z:6
整数pos:4
整数z            = 00000000000000000000000000000110
inverseNの返却値 = 11111111111111111111111111110110

今回は以上です。お疲れ様でした!
次回は演習 7-15, 7-16, 7-17 です。

Goodbye, Terminal… swaponQでした!