10進数から2進数への変換方法

このQ&Aのポイント
  • コマンドライン引数から10進数の値を入力して2進数に変換して出力する方法について説明します。
  • 現在のコードでは変換に失敗している問題があります。
  • WindowsXPの動作環境とActiveperl-5.12.4.1205を使用しています。
回答を見る
  • ベストアンサー

10進数→2進数の出力について

コマンドライン引数から10進数の値を入力して 2進数に変換して出力しようとしています。 ※入力される10進数の値はかなり大きなものを想定しています。 現在は下記のようなコードで変換しようとしていますが失敗しています。 動作環境は『WindowsXP、Activeperl-5.12.4.1205』です。 拙い説明ですが、よろしくお願いいたします。 # コマンドライン引数は「9223372036854775808」 $n = unpack("B8", pack("C", $ARGV[0])); print n; # 実行結果は「11111111」 # 期待している出力結果は「1000・・・000」(←0が64個) 9223372036854775808

noname#142160
noname#142160
  • Perl
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • NaKIT
  • ベストアンサー率62% (15/24)
回答No.2

桁あふれをおこしているようですから、自力で書き換えるしかないかと思います。 サンプルの数字は、16進数では 0x8000_0000_0000_0000 ですから、 0 の数は 63、1を含めて 64 桁ですね。 #! perl %~f1 9223372036854775808 our $decimal = shift; print $decimal, "\n"; my $dec = $decimal; my @bin = (); while ($dec > 0) { unshift (@bin, sprintf("%d",($dec % 2))); $dec = int($dec / 2); } print "0b", join('', @bin), "\n";

その他の回答 (2)

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

No.1さんがおっしゃるようにbigintでいいんじゃないでしょうか? use bigint; my $n = 0 + $ARGV[0]; print substr $n->as_bin, 2;

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

bigint なり Math::BigInt なりを使う?

関連するQ&A

  • 4バイトより大きな値の2進数への変換方法

    コマンドライン引数で4バイトで収まらない値(0x100000000以上)を受け取り、 2進数へ変換し出力したい場合はどのようにすればよいでしょうか? ※longlongのような64bit型を使わないことが前提として・・・ よろしくお願いします。

  • コマンドラインに入力されている文字列の1文字を出力

    ○下記のコードについての質問になります #include <stdio.h> int main( int argc, /*コマンドライン引数*/ char *argv[] /*コマンドライン */ ) { int counter; /*ループカウンタ*/ for( counter = 0 ; counter < argc ; counter++) { printf( "argv[%d]:%s\n" , counter , argv[counter] ); } /*----------------------------------------------------------- printf( "コマンドラインの1文字を抜き取る:%c" , ????????); ------------------------------------------------------------*/ return (0); } ○質問 コマンドラインのプログラムになります。 「--」で囲っている部分になりますが、 コマンドラインに入力されている文字列の1文字だけを出力できるように したいのですが、どうすればこれを実現することができるのでしょうか?? 一例として >command.exe orange ringe ^^^^^^ と、コマンドを打ったときに、「^^」の部分になりますが、 orangeの「a」だけを出力させたい場合を、知りたいと思っております。 以上、宜しくお願いします。

  • bigintのpack

    Perlで16進数→10進数→二進数の変換を行うために packとunpackを使用するのですが 32ビット以上の数であるためにbigintを使用しています。 そのときに 10進→二進変換 二進→10進変換などはどのように行えば良いのでしょうか? 32bitまでならば sub bin_dec { return (unpack("N",(pack("B32", $_[0])))); } sub dec_bin { return (unpack("B32", pack("N", $_[0]))); } のように行えるのですが Nは32bitのlong型のままですので 4294967295以上の数は4294967295になってしまいます。 どうすれば良いのでしょうか? Bit/Vectorモジュールは使えないものとします。

    • ベストアンサー
    • Perl
  • 2進数の出力について

    10進数から2進数に変換するプログラムを作成したのですが、出力する値が5桁以上になると正確な値が出力されず悩んでいます。仕様としましては下記の内容です。 defineを使用し入力文字数を変更出来る(最大5桁入力可能) 入力された最大「99999」の10進数を2進数に変換。 下記のプログラムの何処を修正すれば出力出来るのでしょうか? //10進数文字を数字の2進数で表示// #include "stdafx.h" #define HEX 5 //「function」:入力文字された文字の処理// char ToInt( char cInt) { int mal=0; switch (cInt){ case '0': mal=0; break; case '1': mal=1; break; case '2': mal=2; break; case '3': mal=3; break; case '4': mal=4; break; case '5': mal=5; break; case '6': mal=6; break; case '7': mal=7; break; case '8': mal=8; break; case '9': mal=9; break; } return (mal); } //「function」:入力文字された文字数// char HexInt( char eInt) { char mul=0; switch (eInt){ case '0': mul='0'; break; case 0: mul='0'; break; case 1: mul='1'; break; } return (mul); } //「function」:桁数の計算(10×指数を計算)// int HexAcc( int n ) { int i; int ans=1; for( i=0; i<n; i++ ){ ans *= 10; } return (ans); } int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0,j=0,s=0,k=0,m=0,e=0,ans=0, add=0; char decimal[255], ditto[255],sub[255],temp[255],chg[255],siu[255]; //入力されない場合// if( argc > 1){ } else{ printf("10進数を入力してください。\n"); return 1; } for( k=0; k < HEX; k++ ){ //文字として'0'を代入//////////////////////////// sub[k] = '0'; //subに文字として'0'を代入// temp[k] = '0'; //tempに文字として'0'を代入// chg[k] = '0'; //chgに文字として'0'を代入// siu[k] = '0'; //siuに文字として'0'を代入// } //入力された文字数を受取る// for( i=0; argv[1][i] != '\0'; i++ ){ decimal[i] = argv[1][i]; } decimal[i] = '\0'; //空白文字のチェック// for( i=0; decimal[i] != '\0'; i++ ){ if( decimal[i] != ' ' ){ ditto[n] = decimal[i]; n++; } } //'\0'を代入(文字列の終端)// ditto[n]='\0'; //「0」から「9」のループ// for( n=0; ditto[n] != '\0'; n++ ){ if(( ditto[n] == '0' ) || ( ditto[n] == '1' ) || ( ditto[n] == '2' ) || ( ditto[n] == '3' ) || ( ditto[n] == '4' ) || ( ditto[n] == '5' ) || ( ditto[n] == '6' ) || ( ditto[n] == '7' ) || ( ditto[n] == '8' ) || ( ditto[n] == '9' )){ }else{ printf("エラー\n 10進数を入力してください。\n"); return 0; } } //桁数のループ// for( n=0; ditto[n] != '\0'; n++ ){ m = m + 1 ; } //桁数の判断// if( m <= HEX ){ }else{ printf("エラー\n入力文字数は、%d文字以内にしてください。\n",HEX); return 0; } //subにdittoを代入// for( n=0; ditto[n] != '\0'; n++){ sub[HEX-m+n] = ditto[n]; } sub[HEX] = '\0'; //'\0'を代入(文字列の終端)// //sub[0]からsub[9]の計算// for( n=0; sub[n] != '\0'; n++){ ans = ToInt(sub[n]); add += ans * HexAcc(HEX-n-1); } //2進数の計算・商が0になるまで// for( n=0; sub[n] != '\0'; n++ ){ temp[n] = add % 2; add = add / 2; if( add == 0){ break; } } temp[HEX] = '\0'; //'\0'を代入(文字列の終端)// //桁数のチェック(商・余り)// for( ; n>=0; n-- ){ e = e++; } //temp・値の入替え「tempからchg」// for( n=0; sub[n] != '\0'; n++ ){ chg[HEX-n-1] = temp[n]; } chg[HEX]='\0'; //'\0'を代入(文字列の終端)// //2進数に変換// for( n=HEX; n>=0; n--){ siu[n] = HexInt(chg[n]); } siu[HEX]='\0'; //'\0'を代入(文字列の終端)// //10進数文字を2進数で表示// printf("\n10進数文字を2進数で変換した値は・・・ %s \n",siu); }

  • argv[]によるパラメタ数の制限

    とあるアプリケーションをC言語で作成し、main関数でargv[]によってコマンドラインからの 引数を受け取るようにしています。 そこで、この引数の数が19個あるのですが、13個までは正常に読み込めても、14個からは 読み込めません。 もしかして引数の数に制限はあるのでしょうか? 又、制限が無いとして、このように途中から読み込まれなくなるような別の要因として考えられる ものはあるでしょうか?

  • 数の大小の出力

    C言語で関数を用いたプログラムを作成しているのです、行き詰まっています。内容は、double型の数を2つ入力して大きい数を出力するというものですが、エラーは1つもでてはいないのですが結果が0と表示されてしまいます。私の書いたプログラムに問題点はなんなのか教えていただけないでしょうか? ちなみに、このプログラムの条件は ・main関数は値の入力と関数を呼び出し、結果を出力する。 ・大小を判別する部分は関数として作成。 ・関数の引数は入力した2つの値。 ・関数の戻り値は大きいと判定した数。となっております。 ちなみに私の書いたプログラムはこちらです。条件とあわせて指摘をおねがいいたします。 #include<stdio.h>  double daisyou(double x, double y);  int main(){  printf ("数を入力してください。");  scanf("%f %f",&a,&b);  max = ookii;  printf("大きい数は%f\n",max);  }  doubele daisyou(double x, double y){  double ookii;  if(x>y){  ookii = x;  returun ookii;  }else if(x<y){  ookii = y;  return ookii;  } }

  • 文字数の限界

    つい最近、友人から「コマンドライン引数として受け取れる最大文字列数は、どれくらいかわかる?」と聞かれました。 コマンドライン引数を保存する配列の要素数を決める際に、コマンドライン引数として渡すことができる文字列の限界(または、一般的に想定している文字数)を要素数にしたいとのことだったのですが、どなたか教えていただけないでしょうか? あと、ほかに文字数の上限が設定されているようなもの(例 ファイル名など)があれば教えてください。

  • Perlで数が正しくファイルに読み書き出せません

    Perlで、下のように300の数を読み書きしたところ、 10、26、266、282 だけ正しく読み出せません。なぜですか? open (FRED,"+<test"); $pack_format = "I"; $pack_length=length pack($pack_format,0); for ($n=0;$n<300;$n++){ $age=$n; seek(FRED,$pack_length*$n,0); print FRED pack($pack_format,$age); } for ($n=0;$n<300;$n++){ seek(FRED,$pack_length*$n,0); $qqq=read (FRED,$buf,$pack_length); $age=unpack $pack_format,$buf; print "/$n/$age/$qqq/\n"; }

    • ベストアンサー
    • Perl
  • コマンドライン引数を使って2進数を10進数に変換させたい

    2進数を入力し10進数に変換するプログラムを作成したのですが、うまく動作しないので質問させてください。 コマンドライン引数を使って実行したいのですが2進数も入力出来ず困っています。作成したコードの何処に問題があるのかも解らずにいます。 宜しくお願いします。 作成環境は「Windows XP」「Visual Studio .net 2003」 <作成したコードです> *********************************************************** // binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { if( argc < 8 ){ printf("2進数を入力してください。\n"); exit(1); } //空白文字のチェック// int i=0,n=0; char decimal[ 128 ], binary[ 128 ]; for( i=0; i<argc; i++ ){ if( binary[ i ] != ' ' ){ decimal[ n ] = binary[ i ]; n++; } } //'\0'を代入(文字列の終端)// decimal[ n ]='\0'; //「0」と「1」のループ// for( i=0; i<argc; i++ ){ if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ }else{ printf("エラー\n 「0」と「1」以外の文字が入力されております\n"); } } //桁数のループ// int m = 0; for( i=0; i<'\0'; i++ ){ m = m +1 ; } //桁数の判断/// if( m == 8 ){ }else{ printf("エラー\n2進数(0,1)を8桁、入力して下さい。\n"); } //add・初期化// int add = 0; //decimal[0]~decimal[7]の判断// if( decimal[ 0 ] == '1' ){ add += 128; } if( decimal[ 1 ] == '1' ){ add += 64; } if( decimal[ 2 ] == '1' ){ add += 32; } if( decimal[ 3 ] == '1' ){ add += 16; } if( decimal[ 4 ] == '1' ){ add += 8; } if( decimal[ 5 ] == '1' ){ add += 4; } if( decimal[ 6 ] == '1' ){ add += 2; } if( decimal[ 7 ] == '1' ){ add += 1; } //2進数を10進数に変換した値の出力// printf("2進数を10進数に変換した値は %d \n",add); return 0; }

  • 【続】コマンドライン引数を使って2進数を10進数に変換させたい

    先日も同じプログラムについて質問させていただきました。まだ解決しないので再度、質問させてください。私なりに考えてコードを書いたのですが、おもったように2進数を10進数に変換出来ません。C言語を習い始めたばかりで難しいコードが解りません。出来ましたら作成途中のコードをベースに正常に動くプログラムを教えていただければ幸いです。仕様としては、コマンドラインを使って引数を持たせて動くようにすることです。作成環境は「Windows XP」「Visual Studio .net 2003」 -------------------------------------------------------- <作成したコード> // binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { int i=0,n=0; char decimal[ 128 ], binary[ 128 ]; if( argc < 2 ){ printf("2進数を入力してください。\n"); return 0; } // printf( "arg[0] = %s\n", argv[0] ); // printf( "arg[1] = %s\n", argv[1] ); for( i=0; argv[1][i] != '\0'; i++ ){ binary[i] = argv[1][i]; } binary[i] = '\0'; //空白文字のチェック/////////////////////////////////////////////// for( i=0; i<binary[i]; i++ ){ if( binary[ i ] != ' ' ){ decimal[ n ] = binary[ i ]; n++; } } //'\0'を代入(文字列の終端)/////////////////////////////////////////////////// decimal[ n ]='\0'; //「0」と「1」のループ/////////////////////////////////////////////////////// for( i=0; i<decimal[i]; i++ ){ if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ //「0」または「1」の判断 }else{ printf("エラー\n 「0」と「1」以外の文字が入力されております\n");//エラーメッセージ } } //桁数のループ////////////////////////////////////////////////////////////// int m = 0; for( i=0; i<'\0'; i++ ){ m = m +1 ; } //桁数の判断//////////////////////////////////////////////////////////////// if( m == 8 ){ }else{ printf("エラー\n2進数(0,1)を8桁、入力して下さい。\n");//エラーメッセージ } //add・初期化//////////////////////////////////////////////////////////////// int add = 0; //decimal[0]~decimal[7]の判断/////////////////////////////////////////////// if( decimal[ 0 ] == '1' ){ add += 128; } if( decimal[ 1 ] == '1' ){ add += 64; } if( decimal[ 2 ] == '1' ){ add += 32; } if( decimal[ 3 ] == '1' ){ add += 16; } if( decimal[ 4 ] == '1' ){ add += 8; } if( decimal[ 5 ] == '1' ){ add += 4; } if( decimal[ 6 ] == '1' ){ add += 2; } if( decimal[ 7 ] == '1' ){ add += 1; } //2進数を10進数に変換した値の出力//////////////////////////////////////////// printf("2進数を10進数に変換した値は %d \n",add); return 1; } -------------------------------------------------------- 近くにC言語を相談出来る方がいません、この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。

専門家に質問してみよう