練習問題9.2

立っているbitの数を取得する

public class CheckBit {
	public static int CheckBitCount(Integer n) {
		int Counter=0;
		for(int j=0;j<Integer.SIZE;j++){
			Counter += (n & 1);
			n = n >>> 1;
		}
		return Counter;
	}
	
	public static void main(String[] args) {
		System.out.printf("%31sの1の数は:%d\n",
				Integer.toBinaryString(12),CheckBit.CheckBitCount(12));
		System.out.printf("%31sの1の数は:%d\n",
				Integer.toBinaryString(Integer.MAX_VALUE),CheckBit.CheckBitCount(Integer.MAX_VALUE));
		System.out.printf("%31sの1の数は:%d\n",
				Integer.toBinaryString(Integer.MIN_VALUE),CheckBit.CheckBitCount(Integer.MIN_VALUE));
	}
}

実行結果

1100の1の数は:2
1111111111111111111111111111111の1の数は:31
10000000000000000000000000000000の1の数は:1

公開されているアルゴリズムとの比較という事で、Integer.bitCountの実装を見てみた。

i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;

こんな感じになってる。ループも分岐も無くできるんだなぁ。

練習問題9.1

無限大の計算

public class Infinity {
	public static void main(String[] args) {
		Double pi = Double.POSITIVE_INFINITY;
		Double ni = Double.NEGATIVE_INFINITY;
		
		System.out.println("∞ + ∞  = " + (pi + pi));
		System.out.println("∞ + -∞ = " + (pi + ni));
		System.out.println("∞ - ∞  = " + (pi - pi));
		System.out.println("∞ - -∞ = " + (pi - ni));
		System.out.println("∞ * ∞  = " + (pi * pi));
		System.out.println("∞ * -∞ = " + (pi * ni));
		System.out.println("∞ / ∞  = " + (pi / pi));
		System.out.println("∞ / -∞ = " + (pi / ni));
	}
}

実行結果

∞ + ∞ = Infinity
∞ + -∞ = NaN
∞ - ∞ = NaN
∞ - -∞ = Infinity
∞ * ∞ = Infinity
∞ * -∞ = -Infinity
∞ / ∞ = NaN
∞ / -∞ = NaN

ssh_configを活用しよう!

sshクライアントの設定ファイル(~/.ssh/config)を利用して便利なsshライフを。configファイルを利用する事で、接続先sshサーバのaliasを作れたり、複数の秘密鍵を使い分けたりできる。クライアント環境はmac OS X 10.5
例えば普段

ssh -l user1 example.com

で接続してる人は、configファイルに

Host ex
 HostName example.com
 User user1

とすれば、

ssh ex

で接続できる!
さらに、example.jp へは、ユーザ名 user2 id_rsa.exjp という秘密鍵で接続したい場合は

Host ex-jp
 HostName example.jp
 User user2
 IdentityFile .ssh/id_rsa.exjp

とすると

ssh ex-jp

で接続可に!便利^^
もっと詳しい情報は

man ssh_config

練習問題7.3

public class PascalsTriangle {
	private int pascal[][];
	public PascalsTriangle(int num) {
		pascal = new int[num][];
		for(int i=0,j=0;i<pascal.length;i++){
			pascal[i] = new int[i+1];
			pascal[i][j]=1;
			pascal[i][i]=1;
		}
		calc();
	}
	public int[][] calc(){
		for(int j=2;j<pascal.length;j++)
			for(int i=1;i<pascal[j].length-1;i++)
				pascal[j][i]=pascal[j-1][i-1]+pascal[j][i-1];
		return pascal;
	}
	public void show(){
		for (int[] array : pascal) {
			for (int i : array)
				System.out.printf(" %d ", i);
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		PascalsTriangle pt = new PascalsTriangle(12);
		pt.show();
	}
}

実行結果

1
1 1
1 2 1
1 2 4 1
1 2 4 8 1
1 2 4 8 16 1
1 2 4 8 16 32 1
1 2 4 8 16 32 64 1
1 2 4 8 16 32 64 128 1
1 2 4 8 16 32 64 128 256 1
1 2 4 8 16 32 64 128 256 512 1
1 2 4 8 16 32 64 128 256 512 1024 1

パスカルの三角形。学校で習った気がするけどどんなのだったか思い出せずwikipediaで調べる。うーん、面白いなぁ。

練習問題7.2

public class ConvertType {
	public static void main(String[] args) {
		int tmpi=0;
		long tmpl=0;
		byte maxByte = 127;
		byte miniByte = -128;
		short maxShort = 32767;
		short miniShort = -32768;
		int maxInt = 2147483647;
		int miniInt = -2147483648;
		long maxLong = 9223372036854775807L;
		long miniLong = -9223372036854775808L;
		float maxFloat = 3.4028235E38F;
		float miniFloat = 1.4E-45F;
		double maxDouble = 1.7976931348623157E308D;
		double miniDouble = 4.9E-324D;

		System.out.println(maxByte);
		System.out.println(miniByte);
		System.out.println(maxShort);
		System.out.println(miniShort);
		System.out.println(maxInt);
		System.out.println(miniInt);
		System.out.println(maxLong);
		System.out.println(miniLong);
		System.out.println(maxFloat);
		System.out.println(miniFloat);
		System.out.println(maxDouble);
		System.out.println(miniDouble);
		System.out.println(tmpi=(int)miniByte);
		System.out.println(tmpi=(int)miniShort);
		System.out.println(tmpi=(int)miniLong);
		System.out.println(tmpi=(int)miniFloat);
		System.out.println(tmpl=(int)miniDouble);
		System.out.println(tmpl=miniByte);
		System.out.println(tmpl=miniShort);
		System.out.println(tmpl=miniLong);
		System.out.println(tmpl=(long)miniFloat);
		System.out.println(tmpl=(long)miniDouble);
	}
}