May 26, 2009

16進数→10進数

またもや「どう書く?org( http://ja.doukaku.org/ )」のお題から。

16進数を10進数表記に直すというもの。

HEX:
DEC:


・・・以下がソース。

<div style="display:none">
<script type="text/javascript"><!-- //
/* --------------------------------------------------------------------------- */
String.prototype.toCharArray=function(){
var arr = new Array(this.length);
for(var i = 0; i < this.length; i++){ arr[i] = this.charAt(i); };
return arr;
};
/* --------------------------------------------------------------------------- */
function add(strnum1, strnum2){
var arr1 = strnum1.toCharArray().reverse();
var arr2 = strnum2.toCharArray().reverse();
var max = (arr1.length > arr2.length ? arr1.length : arr2.length) - 1;
var strsum = "";
for(var i = 0, up = 0; i <= max; i++){
var c1 = i < arr1.length ? parseInt(arr1[i],10) : 0;
var c2 = i < arr2.length ? parseInt(arr2[i],10) : 0;
c1 += up;
c1 += c2;
up = Math.floor(c1/10);
c1 %= 10;
strsum = c1 + strsum;
if(i == max) strsum = up+strsum;
}
return strsum;
};
/* --------------------------------------------------------------------------- */
function sum(arr){
var strsum = "";
for(var i = 0; i < arr.length; i++){
strsum = add(strsum, arr[i]);
}
return strsum.replace(/^0*/,"");
};
/* --------------------------------------------------------------------------- */
function multiple(a, b){
var arr_a = a.toCharArray().reverse();
var arr_b = b.toCharArray().reverse();
var arr_c = new Array(arr_b.length);
var max = arr_a.length-1;
for(var i = 0, zeropad=""; i < arr_b.length; i++,zeropad+="0"){
var str_c = "";
for(var j = 0, up=0; j<arr_a.length; j++){
var c = (parseInt(arr_a[j], 10) * parseInt(arr_b[i],10));
c+=up;
up = Math.floor(c/10);
c %= 10;
str_c = c+str_c;
if(j==max && up>0) str_c=up+str_c;
}
str_c+=zeropad;
arr_c[i] = str_c;
}
return sum(arr_c);
};
/* --------------------------------------------------------------------------- */
function hex2decimal(hexstr){
var template = "0123456789ABCDEF";
var arr = hexstr.toUpperCase().substring(2).toCharArray().reverse();
for(var i = 0, hex="1"; i < arr.length; i++, hex=multiple(hex,"16")){
var numc = "" + template.indexOf(arr[i]);
var mult = multiple(numc, hex);
arr[i] = mult;
}
var decstr=sum(arr);
if(decstr.length==0) desctr="0";
return decstr;
};
/* --------------------------------------------------------------------------- */
var hexRegexp=/^0x([0-9A-Fa-f])+$/;
/* --------------------------------------------------------------------------- */
function executeHex2Dec(){
var val = document.getElementById("hexInput").value;
if(!val.match(hexRegexp)){
alert("unmatch:" + val);
return;
}
document.getElementById("decOutput").value=hex2decimal(val);
};
/* --------------------------------------------------------------------------- */
// --></script>
</div>
<div>
<div>HEX:</div>
<input type="text" id="hexInput" style="width:100%"></input>
</div>
<div>
<input type="button" onclick="javascript:executeHex2Dec()" value="transform" />
</div>
<div>
<div>DEC:</div>
<input type="text" id="decOutput" style="width:100%"></input>
</div>

…とりあえず、300桁や400桁は即変換可能なわけだが、最大何桁まで変換できるかはjavascriptの配列や文字列の最大長によるので私はよくわららんw


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/tkturbo/51529351