• ベストアンサー

ビットの取り出し方法

いつもお世話になっております。 今回はビットの取り出しについてお聞きしたいです。 たとえばDWORD型の変数があったとして、この変数の5ビット目は0か1かと いうことを知る簡潔な方法はありますか? セットするときはシフト演算を使えばできますが、 あらかじめセットされたものの指定ビット目を得る方法が知りたいです。 bit = dw % 2 という計算でできると思ったのですが、最上位ビットが 何ビット目か判断する方法がよくわからなかったので ご教授願います。

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

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

>>> たとえばDWORD型の変数があったとして、この変数の5ビット目は0か1かと いうことを知る簡潔な方法はありますか? 5ビット目のみが1、その他のビットはすべて0の定数を準備し、それとのAND演算により得られた結果が 整数として0のときは、0 そうでないときは、1 と判断します。

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

その他の回答 (3)

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

ああ, 最上位ビットを調べるならおそらく x & ~(~(DWORD)0 >> 1) でいいと思う.

全文を見る
すると、全ての回答が全文表示されます。
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.3

No1の方の回答をサンプルにしてみました。 >5ビット目のみが1、その他のビットはすべて0の定数を準備し、それとのAND演算により得られた結果が 整数として0のときは、0 というのはこういうことです。 int a; /* 判定対象の数*/ int b = 16; /* 5ビット目が1な数は16*/ if( a & b ){ /* a の5ビット目は1 */ }else{ /* a の5ビット目は0 */ }

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

(x >> k) & 1U で「k ビット目」がとりだせるんじゃない? ちなみに最下位ビットが「0ビット目」ね.

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

関連するQ&A

  • ビットデータの取得方法について

    32    24 23  16 15    87    0 +--------+--------+--------+--------+ |11000111 |11000111 |11000000 |00000000 | +--------+--------+--------+--------+ ↑のようなビット情報から 24-34bitの1byteにデータa 22-23bitの2bitにデータb 16-21bitの6bitにデータc 14-15bitの2bitにデータd がつめられている場合 データa,b,c,dを参照するためにCで (1)シフト演算で参照する方法 (2)構造体のビットフィールドで参照する方法 をご教授いただけないでしょうか?

  • ビットシフトについて

    12ビットのデータ(符号付き)を16ビットのデータに変換したいです。 自分なりに考えたのですが・・・ 最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、 右に4ビットシフトします(どちらも算術シフトとします) 例  0000 1011 1101 0101 (12bit のデータ) →1011 1101 0101 0000 (左にシフト) →1111 1011 1101 0101 (右にシフト) こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が 反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね? どうしたらいいでしょうか 切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。

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

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

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • シフト演算子について・・・意味がわかりません(T_T)

    左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)

    • ベストアンサー
    • Java
  • 64bit → 32bit型へのキャスト

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

  • アクセス(2003)のVBAでビット演算方法

    エクセルのマクロではビット演算ができましたが、アクセスではどのような方法があるのでしょうか? where in 文で値の自動生成も考えられますが、VBやVCでアドインも可能でしょうか教えてください。 '*********** Excel VBA Bit 演算 ************ Private Sub Boln() Dim MyBln As Boolean Dim Object1 As Range Dim Object2 As Range Set Object1 = Range("B11") Set Object2 = Range("B12") MyBln = Object1 And Object2 MsgBox MyBln End Sub '*********** Excel VBA Bit 演算 ************ 以上、宜しくお願いします。

  • 10進を2進(32ビット)に変換

    VB2008を使っています。 10進を2進(16ビット)に変換するプログラムがあったので、 それを利用して32ビット対応にしたいのですが、 以下のプログラムの☆☆の位置でオーバーフローが発生してしまします。解決法をぜひ教えてください!! wave1は配列で、数字データが格納されています。 100 29584 12 489 : ここで、このデータを2進(32ビット)に変換し、 wave2という新しい配列に格納したいです。 Public Class Form1 (一部省略)   Const WD As Long = 300000 Private wave1(WD) As Integer   Private wave2(WD) As Long (一部省略) For i = 0 To 10 dec2bit = dec(wave1(i)) ☆☆ここでオーバーフロー発生 wave2(i) = dec2bit Next Private Function dec(ByRef decNum0 As Integer) Dim i As Integer Dim ret As Long Dim decNum As Long Dim dec2bit As String If decNum0 >= 0 Then '正、0はそのままセット decNum = decNum0 Else '負のときは、そのビットイメージをセット(例-1なら4294967296) decNum = 4294967296 + decNum0 End If dec2bit = "" '文字列を作成 For i = 1 To 32 '最上位ビット(最も左側のビット)が1か0か判定 ret = decNum And 2147483648 '2147483648は符号無しの&H80000000に相当 If ret <> 0 Then dec2bit = dec2bit & "1" Else dec2bit = dec2bit & "0" End If '左へ1ビットシフトする 'シフト演算子 decNum = decNum << 1 'オーバーフロー防止 If decNum >= 4294967296 Then decNum = decNum - 4294967296 End If Next Return dec2bit End Function End Class

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

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

  • ビットデータをJavaで簡単に扱う方法

    Javaでビットデータを簡単に扱う方法を探しています。 次のファイルがあるとします。 ファイルは次のフォーマットで構成されています。 固定長40bit×n 1~6bit:未使用 7~8bit:データ型判断用指標 9~24bit:整数1 25~40bit:整数2 9~40bit:整数3 9~40bit:単精度浮動小数点数 この時、次の条件に則ってファイルから数値データを取得します。 データ型判断用指標がオンオンの時、整数1 データ型判断用指標がオンオフの時、整数2 データ型判断用指標がオフオンの時、整数3 データ型判断用指標がオフオフの時、単精度浮動小数点数 上記を出来れば自前でのビット操作を行わずに実装したいという思いがあり、 いわゆるビットフィールド的な物が無いかと探してみたのですが、 なかなかそれらしき物が見つからずに困っています。 ご存知であればお教えいただければ幸いです。

    • ベストアンサー
    • Java