• 締切済み

ビットオーバーの数値を扱うアルゴリズム

こんにちは! アセンブラによるコーディングをしているのですが8ビット以上の​数値を扱うことができません。 C言語であれば、「int i=2000;」などのように簡単にできるのですが、私の環境で​は256までの数値しか扱えません。 ...... 20万までの数値を扱いたいのですが、何か良い方法はないでしょ​うか? アルゴリズムもしくはヒントを教えていただけたら助かります。 どうか知っている方がいらっしゃったらよろしくお願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4855/10270)
回答No.3

一桁の数字同士の足し算・かけ算しか知らなくても、桁上がりを適切に扱えば、何桁の計算でも出来るのと同じやり方を使います。 桁上がりの数字のことをキャリーと言います。 それぞれ24bitのX,Yについて、X + Y を計算するとして、Xの下8bit + Yの下8bit => 和の下8bit + キャリーの2^8倍、Xの中8bit + Yの中8bit + さっきのキャリー => 和の中8bit + キャリーの2^8倍、・・・・

全文を見る
すると、全ての回答が全文表示されます。
noname#194317
noname#194317
回答No.2

複数のレジスタをつなげて多バイト長のデータを扱う命令があれば一発ですが、そんなしゃれたものはないってことだったら、メモリ上に展開するしかないでしょう。演算はレジスタに入る長さ(今回は8ビット?)に分割して行い、バイトをまたぐ繰り上げ繰り下げが発生すれば、それはオーバーフローフラグを見て自分で管理することになります。 200,000d=30D40h(符号無し整数の場合)なので、これを格納するメモリは3バイト必要です。03h/D4h/40hの三つに分割してメモリに置くことになりますね。

全文を見る
すると、全ての回答が全文表示されます。
  • DarkMoon
  • ベストアンサー率21% (225/1046)
回答No.1

20万を二進数に直すと、18ビットですが、 これを8ビット環境で扱っている例はあるんですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アルゴリズムとは何なのでしょうか?

    学校でアルゴリズムを習っているのですが、 アルゴリズムとは何なのでしょうか? 教科書として、 「新・明解 C言語によるアルゴリズムとデータ構造」という本を買ったのですが、 内容的には以前C言語を勉強するために読んだC言語の勉強本とあまり変わらないような気がします。 スタックやキュー、ソートに検索など確かにC言語を教わる本には書いてないことはありましたが、 要するにC言語の別の面ということだと思いました。 意味的にはアルゴリズムは数学でいう計算方法、 つまり答えを求めるための色々な方法というように考えたのですが、 実際アルゴリズムとはどのようなものと理解すればいいのでしょうか?

  • ビットデータのチェック方法

    C言語でのビットデータのチェック方法についての質問です。 例として、以下のようなのビット(0~31)を用意して unsigned int bit; bit = 010100…00101 という風にデータを与えているとします。 このとき、ビットに1を持つ桁の個数を数えて 010000→1個 、001001 →1個以上 という風に1個しかないか、それ以上あるかを高速で判定したいのですが、どのような方法が考えられるでしょうか。 私が考えた方法としては count = 0; for (i=0 ; i < 32 ; i++){ if ((bit >> i)%2 == 1) count++; if (count > 1) break; } //countが1なら個数は1個、countが0か1以上なら1個でない。 という方法も行いましたが、処理が遅くなってしまいます。 各桁が1の場合(00…010等)のデータを用意しておき、ビットの値を連想配列へ入れて判別するという方法も考えましたがC言語では無理なようです。 可読性や汎用性は問わないものとして、何か良い方法は無いでしょうか? ご存知の方いらっしゃいましたらよろしくお願いします。

  • アルゴリズムについて

    今、c言語のアルゴリズムの勉強をしています。 入門書が3、4冊を読みました。c言語によるアルゴリズム辞典っていう本を見たら、ほんの少ししかならないです。 将来、プログラマになりたいです。アルゴリズムがプログラマにとって非常に重要ですので。そこで今プログラムの仕事をしている方に聞きたいです。アルゴリズムってどの程度勉強したらいいですか?入門書の場合は、精精木構造までですね。

  • 64ビットWindows上でアセンブリ言語

    こんにちは。 現在、OSは現在、64ビット版のWindows7を使っています。 このWindows7上で、アセンブリ言語によるプログラミングを行いたいと思っています。 どうして今頃アセンブリ言語なのかといいますと、会社の研修で、C言語による組込みソフトウェア開発を学ぶ際に、アセンブリ言語も学習するらしいので、少し予習してみようと思いました。 そこで、64ビット環境でも動作するアセンブラを探してみたのですが、 なかなか見つからず、困っています。 ネット上の情報を頼りに色々と試したのですが、作成した実行ファイルをいざ実行しようとすると、「64ビット環境では動作しない」といった内容のメッセージが出たりして、 どうしても動作してくれませんでした。 64ビット版のWindows上で、アセンブリ言語によるプログラミングができている方がいらっしゃれば、どうやってできたのかを、是非教えて頂きたいです。 必要であれば、インストールすべきソフトウェアの一覧と、環境設定方法なども、簡単に説明して頂ければ、大変助かります。 あと、動作確認を行う簡単なサンプルプログラムも、提示して頂ければ大変助かります。 (なにせ、アセンブリ言語に関する知識がゼロなものですので。) では、よろしくお願い致します。

  • 文字列数値化

     ちょっとした事情によりint型で作った数字の文字列をC言語で数値化する方法を教えてください。 よろしくお願いします。

  • 実践的な遺伝子的アルゴリズムの作成法

    素人ですが、遺伝子的アルゴリズムを考える上で、大きな問題に直面しています。 1)最適化の対象を如何にコーディングするか? 2)交叉点を如何に設けるか? これらは組合せの対象の要素間に何らかの曖昧な複数の相関関係がある場合に難しくなります。 そこで、 1)「遺伝子的アルゴリズム」をタイトルにした一般の技術系の和書に書かれている以外に、実例を調べる手段? 2)社会人が遺伝子的アルゴリズムの開発の実際を学ぶための公共の機関、例えば聴講生として学べる場所? 3)遺伝子的アルゴリズムを組み込んだソフトを作る上で、普段使用しているC++などの汎用プログラム言語と、SchemaやLISPなどの知能プログラミング言語とでは、どちらが便利なのでしょうか? これらの人工知能プログラム言語には、コーディングや交叉のための専用のコマンドが提供されているのでしょうか? 自分は、情報工学の出身ではないため、C++言語と「遺伝子的アルゴリズム」の技術書籍以外には、バックグラウンドがありません。よろしくお願いいたします。

  • アルゴリズムの名前を教えてください

    16ビットのデータが、たとえば1000個、配列で与えられているとします。 unsigned short data[1000]; このデータをしらべて、重複するものを除いて何種類の値があるかを数える場合、一番素朴な方法だと、次のようにやると思います。 int i, j; int count = 0; for(i = 0; i < 1000; i++) {  for(j = 0; j < i; j++) {   if(data[j] == data[i]) {    break;   }  }  if(i == j) {   count++;  } } この方法だと、2重のループがあって処理に時間がかかります。そこで、メモリに余裕があれば内側のループをやめて、 int i; int count = 0; int flag[0x10000]; int n; for(i = 0; i < 0x10000; i++) {  flag[i] = 0; } count = 0; for(i = 0; i < 1000; i++) {  n = data[i];  if(flag[n] == 0) {   flag[n] = 1;   count++;  } } これだと、2重のループを使うものよりは速くなりますが、データが1000個しかないのに、65536個のflagをクリアするのに時間がかかり、今ひとつです。 ところが、次のような賢い方法があり、2重のループも配列のクリアも無くすことができます。 int i; int count = 0; unsigned short flag[0x10000]; unsigned short link[0x10000]; int n; for(i = 0; i < 1000; i++) {  n = data[i];  if(flag[n] >= count || link[flag[n]] != n) {   flag[n] = count;   link[count] = n;   count++;  } } 私がこのアルゴリズムを知ったのはかなり昔なので、どこで知ったのか思い出せないのですが、これほど賢いアルゴリズムだから何か名前がついていると思うのですが、それがわかりません。 名前がわからないので、人に頼んだりする時、上のような長い説明をしなくてはなりませんが、名前がわかっていれば「??法でやっといて」、と言えばいいのですけど。

  • ビット列を表示するプログラム

    C言語の問題でビット列を表示するプログラムが全くできません。 どなたか分かる人はどうか知恵を貸してください。 ユーザが整数を入力すると、その整数をINT型の変数に入れ、そのビット列を表示するプログラム。 ただ、INT型のビット数は環境によって変わる可能性があるため、sizeof()関数を利用してINT型の変数のビット数を求め、そのビット数分だけ表示する。

  • 数値を文字列として結合した結果を数値に変換する

    お世話になっております。 プログラムで、文字を結合した結果を数値に変換する処理にて 処理を高速化できる記述方法があるか質問させてください。 ・やりたいこと  複数の数値を文字列として結合した結果を数値型に高速で変換したい。 ・現在のコード(考え方 C#にて)  今、以下のように数値変換しているのですが、  これ以外の書き方で、スマートな方法はないでしょうか?  ※結果がわかりやすいように変数はその都度宣言しています。 int i1 = "10"; int i2 = "2"; string sConcat = i1.ToString() + i2.ToString() ; // "102" // To Int int convertedInt = int.Parse( sConcat ) ; //102 // To Hex int convertedHex = Convert.ToInt32( sConcat , 16 ); // 0x102 数値を文字にして結合して・・・またキャストというのが 無駄なような気がしています。 すみませんが、良い方法があればご教授ください。

  • C言語で、数値の桁数を求めるには??

    C言語で数値の桁数を求めるプログラムをもとめたいのですが どうすればいいのでしょうか int c; int a; c=12345; a=printf("%d",c); とするとaに桁数は入るのですが cがPRINTF関数により表示されてしまいます どうすればいいでしょうか? わかる方はおしえてください、おねがいします。