C++での24bit符号付き整数値の処理

このQ&Aのポイント
  • C++で24bit符号付き整数値の処理を行う方法をご教示願います。
  • wavファイルから24bitデータを読み出し、倍精度浮動小数点数に変換して再び24bitで書き込む方法についてお知恵を拝借したく存じます。
  • 24bitデータをint型に一度格納して計算を行い、上位3byteを書き込む方法についてアドバイスをいただけませんか?
回答を見る
  • ベストアンサー

C++での24bit符号付き整数値の処理

現在wavファイルからデータを読み出し、少数倍して再び格納するプログラムを作成しています。 量子化ビット数が16,32bitの場合は読み出したデータをshort型,int型の変数に入れて、そのまま計算が出来るのですが、C++には24bitの変数型がないため、24bitデータの処理に苦戦しています。 1サンプルあたり24bitで格納されているデータを読み出し、(double)倍したのち再び24bitずつ(3byte間隔で)書き込むにはどのようにすれば良いでしょうか? 一度int型に格納し、計算してから上位3byteを書き込む方法が簡単だとは思うのですが、負の値の扱いに困っています。 どなたかサンプルプログラムをお教えいただけると幸いです。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

まず、24bit符号付きからintへの変換。 バイトオーダーに注意してint変数に入れて、0x800000 以上であれば負なので、0x1000000 を引きます。 これで符号付きのintになります。 次に、doubleを掛ける演算前に、intの正負の符号を確認しておきます。 doubleを掛けてintに格納したら、0x800000 と&を取って、24bitとしての符号を見ます。 これが、演算前の符号と異なっていたら、オーバーフローが起きた(24bit符号付きで表現できる範囲を超えた)ということなので、目的に応じた適切な処理を行います。

upy038
質問者

お礼

試してみたところ、適切に処理することが出来ました。 ありがとうございました。

関連するQ&A

  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

  • 64bit → 32bit型へのキャスト

    long 64data = 1; int 32data = (int)64data; 64bitの変数で上位32bitは使わない場合、int型の変数にキャストして代入することは可能ですか?

  • wavのビットレートを下げる方法

    ご教授ください。 wavでビットレート512kbps サンプルレート441khz サンプルサイズ16bit,ビットレート1,411kbps データ量11MBの 音源データをビットレート80~112kbps,サンプルレートを1600khz, サンプサイズ8bitに変換して、wav形式のまま、データ量を 軽くすることが可能なのか、可能ならどんなソフトを使って やればいいのか、教えてください。 よろしくお願い致します。

  • VC++ windows 64ビットプログラミング

    VC++でのwindows 64ビットプログラミングを勉強しています。 以下のMSDNのページにたどり着き、サンプルプログラムを作りながら確かめているのですが、 http://msdn.microsoft.com/ja-jp/library/3b2e7499.aspx 以下の記述の意味がよく分からないので、教えてください。 ---ここから--- int と long は、64 ビット Windows オペレーティング システムでは 32 ビット値です。 64 ビット プラットフォーム用にコンパイルする必要があるプログラムでは、ポインターを 32 ビット変数に割り当てないように注意してください。 ポインターは、64 ビットのプラットフォームでは 64 ビットなので、ポインターを 32 ビット変数に割り当てると、ポインター値を切り捨てることになります。 ---ここまで--- intとlongのサイズが4バイトでこれは32ビットのときと変わらず、 ポインタのサイズが8バイトに拡張された(これはメモリアドレスが64ビットになったのだから当然)のは理解しているのですが、 http://msdn.microsoft.com/ja-jp/library/94z15h2c.aspx 「ポインターを 32 ビット変数に割り当てる」というのがどういうこと(どういうコード)なのかがわかりません。 こんなことかなとも思ったのですが、これはありえない記述ですよね =============== int a = 0; int *pt = NULL; a = pt; //32ビット変数にポインタを割り当て???(というよりポインタを代入か) error C2440: '=' : 'int *' から 'int' に変換できません。 1> この変換が可能なコンテキストはありません。 =============== 32ビットでは問題にならなくて、64ビットになったから問題になって、どう変えれば問題なくなるのか という感じで説明していただけると分かりやすいのかな思います。 よろしくお願いします。

  • 合計ビット数

    4語(16バイト)からなるブロックを使用した64Kバイトのキャッシュを実現するために必要な合計ビット数を算出せよ.この値はキャッシュの容量とは異なる.キャッシュの容量は通常はキャッシュに格納されるデータのバイト数を指すからである.キャッシュを実現するためのビット数は,データとタグと有効ビットのすべてを格納するのに必要な記憶容量を表す。 この問題で エントリが4K個あり 各エントリは 128bit(データ)+16bit(タグ)+1bit(有効ビット)=145bit ここまで分かったのですが答えが 593,920bit 145*4K では答えになりません どうすればいいのでしょうか?教えてください.よろしくお願いします

  • 【C++】巨大なビット配列の用意の仕方

    現在C++で数値計算用のプログラムを組んでいます。 その計算の中で、2^16個の「on」または「off」のデータをメモリに記憶させる必要があります。その一つ一つにわざわざintやshortなどの既存のデータ型を使うのは馬鹿らしいので、2^16桁の二進数列(=8.2KB程度)を用意して操作したいと思っています。 (もし仮にon=+1,off=0などとしてint型配列を使うと、262KB必要となり、いくつも宣言することがためらわれます。この2^16個のデータを収める「配列」は全部で8000個程度用意したいのです。) これだけ大きなビット配列を、C++で用意するにはどうしたらよいでしょうか? 試しにビットフィールドを用いて struct bit{ unsigned elm :1<<16;  //2^16個のビット数列 }; と宣言してみたのですが、基本型のビット数を超えるからとコンパイルは通りませんでした。@VC++ リソースを活用するためにビット配列を扱った経験のある方など、どうかご教授よろしくお願いします。

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • 2進表示の大きな整数の余りを求めるには

    こんにちは。 表題のように、VC++で大きな整数の余りを求める方法ですが、与えられるのは2進表示だとします。例えば  1101000101101・・・・・・0010 (256 bit) を  1101001101110010 (16bit) で割った余りを求めたいのです。考えられる方法としてはどんなものがあるでしょうか? ちなみにまともにやろうとすると、2^256クラスの変数が必要となり(10^77のオーダー、long long intでも入りきらず)、C言語ではできないような気がします。 ある人に、ビットハンドリングで2進数のまま計算すればできると言われたのですが、そういう方法はあるんですか?あるなら教えてほしいんです。 よろしくお願いいたします。

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • C言語のビットフィールドについて

    はじめまして,今C言語を勉強中なのですが, ビットフィールドの宣言について質問があります。 勉強に使用しているテキストでは, ビットフィールドの宣言にはunsigned int型を使用すると書かれています(下記例参照)。 ここで質問は,unsigned charなどの型は推奨されない理由があるのか,ということです。 実際にunsigned char型で実行してもプログラムは動きますし,そちらのほうが語長も短くて済むのでいいような気がします。 テキストの書き方だと,他の型について言及していなかったので,なにか理由かあるのか,それとも特に問題ないのか,疑問に思っています。 わかる方いましたら,回答いただけると嬉しいです。 (ex) struct{ unsigned int bit0:1; unsigned int bit1:1; : unsigned int bit7:1; }bits;

専門家に質問してみよう