& はビット論理積演算子(bitwise and operator)、| はビット論理和演算子(bitwise inclusive or operator)、^ はビット排他的論理和演算子(bitwise exclusive or operator)、~ はビット単位の補数演算子(bitwise complement operator)と呼ばれます。これらの演算子で行われる論理演算の真理値表が以下になります。
2つの整数を読み込んで、ビット単位の論理演算を行った結果を表示するプログラムを以下に示します。
//BitwiseOperation.java
//int型整数のビット単位の論理積・論理和・排他的論理和・補数を表示
import java.util.Scanner;
public class BitwiseOperation {
//int型のビット構成を表示
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.println("2つの整数を入力してください。");
System.out.print("a:"); int a = stdIn.nextInt();
System.out.print("b:"); int b = stdIn.nextInt();
System.out.print("a = "); printBits(a);
System.out.print("\nb = "); printBits(b);
System.out.print("\na & b = "); printBits(a & b);
System.out.print("\na | b = "); printBits(a | b);
System.out.print("\na ^ b = "); printBits(a ^ b);
System.out.print("\n~a = "); printBits(~a);
System.out.print("\n~b = "); printBits(~b);
stdIn.close();
}
}
//Max3Method.java
//3つの整数値の最大値を求める(メソッド)
import java.util.Scanner;
public class Max3Method {
static int max(int a, int b, int c){
int max = a;
if(b > max) max = b;
if(c > max) max = c;
return max;
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt();
System.out.print("整数b:"); int b = stdIn.nextInt();
System.out.print("整数c:"); int c = stdIn.nextInt();
System.out.println("最大値は" + max(a, b, c) + "です。");
stdIn.close();
}
}
//Power.java
//べき乗をもとめる
import java.util.Scanner;
public class Power {
//xのn乗を返す
static double power(double x, int n){
double tmp = 1.0;
for(int i = 1; i <= n; i++)
tmp *= x;
return tmp;
}
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("aのb乗を求めます。");
System.out.print("実数a:"); double a = stdIn.nextDouble();
System.out.print("整数b:"); int b = stdIn.nextInt();
System.out.println(a + "の" + b + "乗は" + power(a, b) + "です。" );
stdIn.close();
}
}
nが整数ですから、xをn回掛け合わせた値がxのn乗です。メソッドをpowerでは、1.0で初期化された変数tmpに対して、xの値をn回掛けています。for文が終了した時に最終的な値がtmpに渡されます。このように引数として値がやり取りされるメカニズムを値渡し(pass by value)と呼ばれます。
max = a[0];
if(a[1] > max) max = a[1];
if(a[2] > max) max = a[2];
このif文をより柔軟に書き換えた形が以下になります。
max = a[0];
for(int i = 1; i < a.length; i++)
if(a[i] > max) max = a[i];
このように配列の要素1つずつ順になぞっていく手続きを走査(traverse)と呼びます。
キーボードから読み込んだ値から最高点を求めるプログラムを走査を使って作成しましょう。
//HighScore.java
//点数を読み込んで最高値を表示
import java.util.Scanner;
public class HighScore {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
final int num = 5;
int[] score = new int[num];
System.out.println(num + "人分の点数を入力してください。");
for(int i = 0; i < num; i++){
System.out.print((i + 1) + "番の点数:");
score[i] = stdIn.nextInt();
}
int max = score[0];
for(int i = 1; i < score.length; i++)
if(score[i] > max) max = score[i];
System.out.println("最高点は" + max + "点です。");
stdIn.close();
}
}
//ArraySumForIn.java
//配列の全要素の和を求めて表示(拡張for文)
public class ArraySumForIn {
public static void main(String[] args){
double[] a = {1.0, 2.0, 3.0, 4.0, 5.0};
for(int i = 0; i < a.length; i++)
System.out.println("a[" + i + "] =" + a[i]);
double sum = 0;
for(double i : a)
sum += i;
System.out.println("全要素の和は" + sum + "です。");
}
}
このfor文は以下のように理解しましょう。
配列 a の先頭から末尾までの全要素を1個ずつ走査します。ループ本体では、現在着目している要素を i と表現します。
//ReverseArray.java
//配列の要素の順序を逆順に並べて表示
import java.util.Random;
import java.util.Scanner;
public class ReverseArray {
public static void main(String[] args){
Random rand = new Random();
Scanner stdIn = new Scanner(System.in);
System.out.print("要素数:");
int n = stdIn.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++){
a[i] = 10 + rand.nextInt(90);
System.out.println("a[" + i + "] :" + a[i]);
}
for(int i = 0; i < n / 2; i++){
int t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
System.out.println("要素の並びを逆にしました。");
for(int i = 0; i < n; i++)
System.out.println("a[" + i + "] :" + a[i]);
stdIn.close();
}
}
//CoppyArray.java
//配列の全要素をコピー
import java.util.Scanner;
public class CoppyArray {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("要素数:");
int n = stdIn.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for(int i = 0; i < n; i++){
System.out.print("a[" + i + "] = ");
a[i] = stdIn.nextInt();
}
for(int i = 0; i < n; i++)
b[i] = a[i];
System.out.println("aの全要素を配列bにコピーしました。");
for(int i = 0; i < n; i++)
System.out.println("b[" + i + "] = " + b[i]);
stdIn.close();
}
}
配列のコピーを行うのが、以下の部分です。これにより、a[0]をb[0]にa[1]をb[1]にと i の数だけコピーしていくことができます。
//PointSumAve.java
//点数を読み込んで合計点、平均点を表示
import java.util.Scanner;
public class PointSumAve {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int sum = 0;
System.out.println("5人の点数を入力してください。");
System.out.print("1番の点数:");
int akane = stdIn.nextInt();
sum += akane;
System.out.print("2番の点数:");
int baba = stdIn.nextInt();
sum += baba;
System.out.print("3番の点数:");
int cocone = stdIn.nextInt();
sum += cocone;
System.out.print("4番の点数:");
int docomo = stdIn.nextInt();
sum += docomo;
System.out.print("5番の点数:");
int eita = stdIn.nextInt();
sum += eita;
System.out.println("合計は" + sum + "点です。");
System.out.println("平均は" + (double)sum / 5 + "点です。");
stdIn.close();
}
}
//IntArray2.java
//配列の各要素に1,2,3,4,5を代入表示
public class IntArray2 {
public static void main(String[] args){
int[] a = new int[5];
for(int i = 0; i < a.length; i++)
a[i] = i + 1;
for(int i = 0; i < a.length; i++)
System.out.println("a[" + i + "] = " + a[i]);
}
}
//IntArrayScan.java
//配列の全要素に値を読み込んで表示
import java.util.Scanner;
public class IntArrayScan {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("要素数:");
int n = stdIn.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++){
System.out.print("a[" + i + "] = ");
a[i] = stdIn.nextInt();
}
System.out.println("");
for(int i = 0; i < n; i++)
System.out.println("a[" + i + "] =" + a[i]);
stdIn.close();
}
}
//IntArrayInit.java
//配列の各要素を数字で初期化表示
public class IntArrayInit {
public static void main(String[] args){
int[] a = {1,2,3,4,5};
for(int i = 0; i < a.length; i++)
System.out.println("a[" + i + "] = " + a[i]);
}
}
//PointSumAveArray.java
//点数を読み込んで合計点、平均点を表示
import java.util.Scanner;
public class PointSumAveArray {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
int sum = 0;
final int num = 5;
int[] score = new int[num];
System.out.println(num + "人分の点数を入力してください。");
for(int i = 0; i < num; i++){
System.out.print((i + 1) + "番の点数:");
score[i] = stdIn.nextInt();
sum += score[i];
}
System.out.println("合計は" + sum + "点です。");
System.out.println("平均は" + (double)sum / num + "点です。");
stdIn.close();
}
}
//CarriageReturn.java
//復帰の出力によって表示済み文字を書き換える
public class CarriageReturn{
public static void main(String[] args){
System.out.print("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println("\r12345");
}
}
//IntegralToFloat.java
//整数型から浮動小数点型への変換(精度が失われる例)
public class IntegralToFloat {
public static void main(String[] args){
int a = 123456789;
long b = 1234567890123456789L;
System.out.println(" a = " + a);
System.out.println("(float) a =" + (float)a);
System.out.println(" b = " + b);
System.out.println("(double) b =" + (double)b);
}
}
//FloatSum1.java
//0.0から1.0まで0.001単位で増やして合計を表示(繰り返しをfloat制御)
public class FloatSum1 {
public static void main(String[] args){
float sum = 0.0F;
for(float x = 0.0F; x <= 1.0F; x += 0.001F){
System.out.println("x = " + x);
sum += x;
}
System.out.println("sum =" + sum);
}
}
//DecOctHexLiteral.java
//整数リテラル(10進数/8進数/16進数)
public class DecOctHexLiteral {
public static void main(String[] args){
int a = 13; //10進数の13
int b = 013; //8進数の13
int c = 0x13; //16進数の13
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}
57.3のように実数を表す定数を浮動小数点リテラル(floating-point literal)と呼びます。型を指定するのが、浮動小数点接尾語(float type suffix)です。float型を指定するのがfとFであり、double型を指定するのがdとDです。指定しない場合はdouble型とみなされることになっています。
//BooleanTester.java
//関係演算子・等価演算子・論理否定演算子が生成する値を表示
import java.util.Scanner;
public class BooleanTester {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数a:"); int a = stdIn.nextInt();
System.out.print("整数b:"); int b = stdIn.nextInt();
System.out.println("a < b = " + (a < b));
System.out.println("a <= b =" + (a <= b));
System.out.println("a > b =" + (a > b));
System.out.println("a >= b =" + (a >= b));
System.out.println("a == b =" + (a == b));
System.out.println("a != b =" + (a != b));
System.out.println("!(a==0) =" + !(a == 0));
System.out.println("!(b==0) =" + !(b == 0));
stdIn.close();
}
}
//SumBreak1.java
//読み込んだ整数を加算
import java.util.Scanner;
public class SumBreak1 {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("整数を加算します。");
System.out.print("いくつ加算しますか?:");
int n = stdIn.nextInt();
int sum = 0;
for(int i = 0; i < n; i++){
System.out.print("整数0で終了:");
int t = stdIn.nextInt();
if(t == 0)break; //for文から抜け出せる
sum += t;
}
System.out.println("合計は" + sum + "です。");
stdIn.close();
}
}
//SumBreak2.java
//読み込んだ整数を加算(1000以下まで)
import java.util.Scanner;
public class SumBreak2 {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("整数を加算します。");
System.out.print("いくつ加算しますか?:");
int n = stdIn.nextInt();
int sum = 0;
for(int i = 0; i < n; i++){
System.out.print("整数:");
int t = stdIn.nextInt();
if(sum + t > 1000){
System.out.println("合計が1000を超えました。");
System.out.println("最後の数値は無視されます。");
break;
}
sum += t;
}
System.out.println("合計は" + sum + "です。");
stdIn.close();
}
}
//SumContinue.java
//読み込んだ整数を加算(負の値は加算しない)
import java.util.Scanner;
public class SumContinue {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.println("整数を加算します。");
System.out.print("いくつ加算しますか?:");
int n = stdIn.nextInt();
int sum = 0;
for(int i = 0; i < n; i++){
System.out.print("整数:");
int t = stdIn.nextInt();
if(t < 0){
System.out.println("負の数は加算されません。");
continue;
}
sum += t;
}
System.out.println("合計は" + sum + "です。");
stdIn.close();
}
}
//PrintfDecimal.java
//System.out.printfによる整数値の出力
public class PrintfDecimal {
public static void main(String[] args){
int x = 55;
int y = 123;
System.out.printf("x = %3d\n", x);
System.out.printf("y = %3d\n", y);
}
}
//DecimalFloat.java
//整数値と実数値を表示
import java.util.Scanner;
public class DecimalFloat {
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
System.out.print("整数x:");
int x = stdIn.nextInt();
System.out.print("整数y:");
double y = stdIn.nextDouble();
System.out.printf("x =%3d y =%6.2f\n", x, y);
stdIn.close();
}
}