10進数を2進数に変換するプログラムについての質問

このQ&Aのポイント
  • 質問文章では、10進数を2進数に変換するプログラムについての質問がされています。
  • 具体的には、計算結果がどのように格納され、0x00000001という値の意味、シフト演算子の意味、括弧内の意味についての疑問があります。
  • また、nの制限についても質問者は調査を求めています。
回答を見る
  • ベストアンサー

10進数を2進数にするプログラムについて

問題:10進数nを2進数に変換する(n=<16^4-1(65535)とする)。 という問題に対して、 for(i=0;i<32,i++){ b[i]=n&0x00000001; 1.この計算をするとb[i]に            どんな数が入るのか。        2.0x00000001ってどういう意味ですか? n>>=1;   3.シフト演算子の意味がわかりません。。。 } do{ i--; } while(!b[i]&&i>0);  4.括弧内の意味について prontf("binary:") while(i>=0){ printf("%d",b[i]); } printf("?n?n");     5.括弧内の意味について 以上の1~5の意味がわかりません。 また、nの制限については、if文で全体を囲えばよろしいのでしょうか? 以上の質問について教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

プログラムの前提条件としてint b[32]となっているとします。 またnには11が格納されているとします。 1-3. n & 0x00000001 は両辺のビットの論理積をとります。 つまり「最後のビットは1かどうか」を計算しb[i]に最後のビットが1なら1が、 0なら0が格納されていきます。 今回はn=11ですから二進数で表すと1011ですからb[0]に1が格納されます。 これで最後のビットが確認できたのでn>>=1を計算しnを右へ1ビットずらします。 ですから二進数でn=101となります。 これを繰り返すので配列には順に{1,1,0,1,0,....0}と格納されます。 このときiは32でfor文を抜けています。 配列の後ろから表示させれば二進数のデータが表示されますが、先頭に 無駄な0がたくさん並んでしまいます。 そこで2番目のdo-whileでカウントダウンしながらデータの頭だしをしているわけです。 4. ですからこの条件はカウントダウン中にb[i]が0でなくかつiが正である間という条件で データのはじめに来る1をさがしています。 次のwhile文ですが、おそらくprintfの次にi--;が あるのではないでしょうか?(無限ループになっています) 5.最後のprintfのなかは「\n\n」で単に2行改行しているだけかと思います。

naggy_v
質問者

お礼

非常に丁寧なご回答ありがとうございます。 今までfortranしかさわったことないのでこのビット演算子とかは抵抗がありすぎ、なかなか理解できませんでしたがすごくよくわかりました。 ありがとうございました。

関連するQ&A

  • 2進数の加算の繰り上がり

    2進数の四則演算のプログラムを作りたいと思い、2進数を表示するところまではできたのですが、加算になると繰り上がりという壁にぶつかってしまいました。繰り上がりや桁上げなどがよく分からないので、お教えください。(下のソースコードが繰り上がりのない加算をするまでのものです) #include <stdio.h> int main(void) { int a,b,i,j,x[8],y[8],z[8]; do{ puts("二つの符号なし整数を入力してください。(ただしa>bとし、bはのべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); if(a < = b) puts("入力した値がa>bになっていません。\a"); }while(a < = b); for( i = 0; i < = 7; i + +){ x[i] = a % 2; a = a / 2; y[i] = b % 2; b = b / 2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for( i = 7; i > = 0; i - -){ printf("%d",x[i]); } puts(""); printf("b="); for( i = 7; i > = 0; i - -){ printf("%d",y[i]); } printf("となります。\n\n"); printf("<加算>\n"); printf("c=a+b="); for( j = 7; j > = 0; j - -){ z[j]=x[j]^y[j]; printf("%d",z[j]); } return(0); }

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • n^kのwhile文のプログラムについて

    下のプログラムを実行すると無限に計算されるのはなぜですかどこがおかしいか教えてください /* while1.c---for bun* n no jou*/ main() { int n,k,m,i; printf("Input n\n"); scanf("%D",&n"); printf("Input k\n"); scanf("%d",&k"); m=1; while (i<=5) { m=m*n; printf("%d no %d jou =%D\n",n,i,m); i++; } } あとこれをdo while文にするにはどうすればいいんですか

  • コマンドライン引数を使って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から120以下の素数を求める

    2以上120以下の素数を全て求めて表示するプログラムを書きなさい。 素数か否かの判定には以下のアルゴリズム[処理手順] (2 <= n <= 120のときのみ有効)を用いなさい。 i) nが2, 3, 5, 7, 11のうちのどれかと等しければNは素数 ii) nが2, 3, 5, 7, 11の全てに対して割切れなければNは素数 iii) それ以外(iもiiも不成立)のとき、Nは素数ではない。 *) 2, 3, 5, 7, 11は最初に出力してしまい、 n=12から120までをfor文のなかで判定すればよい。 というC言語の課題です。 自分でプログラムを作ったのですが、うまくできません・・。 if文が働いてないようなのですが、どこが間違っているのでしょうか? #include <stdio.h> int main(void) { int i; printf("2\n"); printf("3\n"); printf("5\n"); printf("7\n"); printf("11\n"); for (i=12;i<=120;i++){ if (i%2!=0 || i%3!=0 || i%5!=0 || i%7!=0 || i%11!=0){ printf("%d\n",i); } else{ printf(""); } } printf( "\n" ); 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言語を相談出来る方がいません、この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。

  • 素因数プログラムで、間違えて因数4で割らない

    練習問題 5-15  2以上の数値を入力し、素因数分解した結果を表示しなさい。    疑問ですが、素因数分解なので割る数字は、2.3.5.7.・・・の自分の数字しか割りきれない数字で  割ります。それでは、以下のプログラムはどこでそれを判断しているのでしょか?  4で割ろうとしないのは、どこのプログラムが司っているのでしょうか  もし!見えない取り組みがあれば宜しくお願いします。  以下プログラムです。 1) int n, x; 2) scanf("%d", &n ); 3) for( x = 2 ; n > 1 ; x++ ){ 4) while( ( n % x ) == 0 ){ 5) printf( "%d ", x ); 6) n /= x; } }

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • プログラムについて教えて下さい。

    ある値を入力し、0以上100以下のときだけ平方根を計算するプログラムで、負の値や100よりも大きな値を入力したときは何も表示せず、 再度入力するようなプログラムを教えて下さい。 #include <stdio.h> #include <math.h> main() { int n,i; printf("0から100までの値を入力してください。"); scanf("%d",&n); i=0; do{ i++;} while(i<=100); if(100>=0) printf("%dの平方根は%dです。\n",n,sqrt(i)); return(0); } どうか、お願いします。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

専門家に質問してみよう