汎用機メモっとくか

しごと用の(学習メモ&お気に入り保存)。

VBScriptで10進数15桁+-のdec2bin(64bit)をできるようにしてみた。(続きAWKで)

2018年01月05日 01時16分54秒 | WSH

blogの文字数制限を超えたので別ページ

ついでにgawk。10進数15桁+-でお願いします。
<d2b.awk>
BEGIN{
  bin16[0]  = "0000"
  bin16[1]  = "0001"
  bin16[2]  = "0010"
  bin16[3]  = "0011"
  bin16[4]  = "0100"
  bin16[5]  = "0101"
  bin16[6]  = "0110"
  bin16[7]  = "0111"
  bin16[8]  = "1000"
  bin16[9]  = "1001"
  bin16[10] = "1010"
  bin16[11] = "1011"
  bin16[12] = "1100"
  bin16[13] = "1101"
  bin16[14] = "1110"
  bin16[15] = "1111"
  z = 0
  for(x=0;x<16;x++){
      for(y=0;y<16;y++){
          bin256[z] =  bin16[x] bin16[y]
          z++
      }
  }
  hex16[0]  = "0"
  hex16[1]  = "1"
  hex16[2]  = "2"
  hex16[3]  = "3"
  hex16[4]  = "4"
  hex16[5]  = "5"
  hex16[6]  = "6"
  hex16[7]  = "7"
  hex16[8]  = "8"
  hex16[9]  = "9"
  hex16[10] = "A"
  hex16[11] = "B"
  hex16[12] = "C"
  hex16[13] = "D"
  hex16[14] = "E"
  hex16[15] = "F"
  z = 0
  for(x=0;x<16;x++){
      for(y=0;y<16;y++){
          hex256[z] =  hex16[x] hex16[y]
          z++
      }
  }

}
#MAIN START
{
   a001 = dec2bin($0)
   print $0 "\t" a001
}
#MAIN EXIT
func dec2bin(number){
  aQuo32Quo16Quo8 = 0
  aQuo32Quo16Mod8 = 0
  aQuo32Mod16Quo8 = 0
  aQuo32Mod16Mod8 = 0
  aMod32Quo16Quo8 = 0
  aMod32Quo16Mod8 = 0
  aMod32Mod16Quo8 = 0
  aMod32Mod16Mod8 = 0
  flg_sign = 0
 
  if(number<0){
     number = number * -1
     flg_sign = 1
  }
 
  aQuo32 = int(number / 2^32)
  aQuo32Quo16 = int(aQuo32 / 2^16)
  aQuo32Quo16Quo8 = int(aQuo32Quo16 /   2^8)
  aQuo32Quo16Mod8 =     aQuo32Quo16 %   2^8
   
  aQuo32Mod16 = aQuo32 - (aQuo32Quo16 * 2^16)
  aQuo32Mod16Quo8 = int(aQuo32Mod16 /   2^8)
  aQuo32Mod16Mod8 =     aQuo32Mod16 %   2^8
   
  aMod32 = number -  (aQuo32 * 2^32)
  aMod32Quo16 = int(aMod32 / 2^16)
  aMod32Quo16Quo8 = int(aMod32Quo16 /   2^8)
  aMod32Quo16Mod8 =     aMod32Quo16 %   2^8
   
  aMod32Mod16 = aMod32 - (aMod32Quo16 * 2^16)
  aMod32Mod16Quo8 = int(aMod32Mod16 /   2^8)
  aMod32Mod16Mod8 =     aMod32Mod16 %   2^8
 
  if(flg_sign == 1){
    j= 0
    for(j=0;j<8;j++){
      minus[j]   = 0
      kuriage[j] = 0
    }
    kuriage[7]  = 1

    minus[0] = 255 - aQuo32Quo16Quo8
    minus[1] = 255 - aQuo32Quo16Mod8
    minus[2] = 255 - aQuo32Mod16Quo8
    minus[3] = 255 - aQuo32Mod16Mod8
    minus[4] = 255 - aMod32Quo16Quo8
    minus[5] = 255 - aMod32Quo16Mod8
    minus[6] = 255 - aMod32Mod16Quo8
    minus[7] = 255 - aMod32Mod16Mod8

     if((minus[7] + kuriage[7]) > 255){
        kuriage[6]  = 1
        minus[7]    = 0
     }else{
        minus[7] = minus[7] + kuriage[7]
     }
     for(j=6;j>0;j--){
       if((minus[j] + kuriage[j]) > 255){
          kuriage[j - 1]  = 1
          minus[j]        = 0
       }else{
          minus[j] = minus[j] + kuriage[j]
       }
     }
     if((minus[0] + kuriage[0]) > 255){
        #こんなのは、範囲外
        #kuriage[0]  = 1
        minus[0]    = 0
     }else{
        minus[0] = minus[0] + kuriage[0]
     }
     join_minus =            bin256[minus[0]] bin256[minus[1]] bin256[minus[2]] bin256[minus[3]]
     join_minus = join_minus bin256[minus[4]] bin256[minus[5]] bin256[minus[6]] bin256[minus[7]]
     join_minus = join_minus "\t"
     join_minus = join_minus hex256[minus[0]] hex256[minus[1]] hex256[minus[2]] hex256[minus[3]]
     join_minus = join_minus hex256[minus[4]] hex256[minus[5]] hex256[minus[6]] hex256[minus[7]]
     return join_minus
  }else{
     join_plus =             bin256[aQuo32Quo16Quo8] bin256[aQuo32Quo16Mod8] bin256[aQuo32Mod16Quo8] bin256[aQuo32Mod16Mod8]
     join_plus =   join_plus bin256[aMod32Quo16Quo8] bin256[aMod32Quo16Mod8] bin256[aMod32Mod16Quo8] bin256[aMod32Mod16Mod8]
     join_plus =   join_plus "\t"
     join_plus =   join_plus hex256[aQuo32Quo16Quo8] hex256[aQuo32Quo16Mod8] hex256[aQuo32Mod16Quo8] hex256[aQuo32Mod16Mod8]
     join_plus =   join_plus hex256[aMod32Quo16Quo8] hex256[aMod32Quo16Mod8] hex256[aMod32Mod16Quo8] hex256[aMod32Mod16Mod8]
     return join_plus
  }
}