Dec2hex.java

/*
 * $Id: Dec2hex.java,v 1.12 2008/02/25 08:35:51 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.matrix;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.IntMatrix;


/**
 * 十進数を十六進数に変換するクラスです。
 * 
 * <p>Decimal number to hexadecimal number
 * 
 * @author koga
 * @version $Revision: 1.12 $
 * @see org.mklab.tool.matrix.Hex2dec
 * @see org.mklab.tool.matrix.Hex2num
 */
public class Dec2hex {

  /**
   * メインメソッド
   * 
   * @param args コマンドライン引数
   */
  public static void main(String[] args) {
    System.out.println("2748 = " + dec2hex(2748)); //$NON-NLS-1$
  }

  /**
   * 10進数の整数を16進数の文字列に変換します。
   * 
   * @param value 10進数
   * @return 16進数 (hexadecimal number)
   */
  public static String dec2hex(int value) {
    int x = value;
    if (x == 0) {
      return "0"; //$NON-NLS-1$
    }

    double d = Math.log(x) / Math.log(16);
    if (d > 0) d = Math.floor(d);
    else d = Math.ceil(d);
    int n = 1 + (int)d;
    IntMatrix idx = new IntMatrix(DoubleMatrix.unit(1).appendRight(DoubleMatrix.ones(1, n - 1).multiply(16)).cumulativeProduct());

    String h = ""; //$NON-NLS-1$
    String ABCDEF = "ABCDEF"; //$NON-NLS-1$
    for (int i = 1; i <= n; i++) {
      d = ((double)(x)) / idx.getIntElement(n - i + 1);
      if (d > 0) d = Math.floor(d);
      else d = Math.ceil(d);
      int g = (int)d;
      x = x % idx.getIntElement(n - i + 1);

      if (g > 9) {
        h = h + ABCDEF.charAt(g - 9 - 1);
      } else {
        h = h + g;
      }
    }
    return h;
  }

}