21

shortC でデータ型の特定の部分 (ビット数) を抽出する必要があります。

たとえば、11001101000 11000 として 52504 のバイナリがあり、最初の 6 (FROM LSB --> MSB ie 011000 10 進数 24) ビットと残りの 10 ビット (11001101000 10 進数 820) が必要です。

同様に、この関数を一般化しすぎて、「開始」と「終了」を指定して特定のビット数 (つまり、10 進値に相当するビットのチャンク) を抽出できないようにしたいと考えています。

他の投稿を確認しましたが、特定の機能があまり一般化されていないため、それらは役に立ちませんでした。

shortCのデータ型で機能するものが必要です。

編集

サイズが 2048 バイトの短い配列があります。各ピクセルは 10 ビットです。したがって、各バイトで構成される私の16ビットは、2ピクセルのデータ、場合によっては3ピクセルのデータを占有します。

お気に入り

( ピクセル : 0,1 ) 10 ビット + 6 ビット

次に ( PIXEL : 1,2,3 ) 4 BITS (最初のピクセルの残りのビット) + 10 BITS + 2 BITS.

など..このパターンは続きます...したがって、各ピクセルを抽出し、各ピクセルが完全にバイト全体(16ビット)で占有される配列全体を作成したい.. 1バイトには1が含まれている必要がありますDATA PIXEL、その他の BYTE には、その他の PIXEL 値を 16 ビット全体で含める必要があります。

4

8 に答える 8

27

これを自分で構築するために知っておく必要がある構成要素が 2 つあります。

  • N最下位ビットを取得するには、最後に 1 を含むビット マスクを作成する必要がありますN。次のようにします((1 << N)-1)1 << Nis 2 ^ N: st の位置にシングルがあり、1その後N+1はすべてゼロです。1 を引くと、必要なマスクが得られます。
  • 最下位Mビットの削除は、右への単純なシフトです。k >> M

Mからtoを切り取るアルゴリズムNは 2 段階のプロセスになります。元の値のビットを右にシフトし、1のマスクを使用しMてビットごとに実行します。ANDN-M

#define LAST(k,n) ((k) & ((1<<(n))-1))
#define MID(k,m,n) LAST((k)>>(m),((n)-(m)))

int main() {
    int a = 0xdeadbeef;
    printf("%x\n",  MID(a,4,16));
    return 0;
}

このフラグメントは、4 を含むビットから 16 を含まないビットを切り取り、bee実行すると出力します。ビットはゼロから数えられます。

于 2012-04-10T14:14:29.433 に答える
15
unsigned short extract(unsigned short value, int begin, int end)
{
    unsigned short mask = (1 << (end - begin)) - 1;
    return (value >> begin) & mask;
}

[begin, end)は半開間隔であることに注意してください。

于 2012-04-10T14:14:45.713 に答える
10

次のように実行できます。

mask = ~(~0 << (end - start + 1));
value = (n >> start) & mask;

ここnで、 は元の整数で、valueは抽出されたビットです。

は次のmaskように構成されます。

1. ~0 = 1111 1111 1111 1111 1111 1111 1111 1111
2. ~0 << (end - start + 1) = 1111 1111 1111 1111 1100 0000 0000 0000
   // assuming we are extracting 14 bits, the +1 is added for inclusive selection
   // ensure that end >= start
3. ~(~0 << (end - start + 1)) = 0000 0000 0000 0000 0011 1111 1111 1111

現在nはビット単位で右にシフトされstart、目的のビットが左に揃えられます。次に、ビットごとの AND によって結果が得られます。

于 2012-04-10T14:11:10.520 に答える
0
void  f(short int last, short int first, short int myNr){
      //construct mask for last bits
      short int mask=0;
      for(int i=0;i<last;i++)
       { mask+=1;
        mask<<1;}
      short int aux= myNr;
      aux=aux&mask; // only last bits are left
      //construct mask for first bits
      mask=0;
      for(int i=0;i<first;i++)
       { mask+=0x8000h;
        mask>>1;} 
      aux=myNr;  
      aux&=mask;
      aux>>last; // only first bits are left and shifted
}

パラメータを追加して、値などを取得できます

于 2012-04-10T14:24:09.207 に答える
0
// This is the main project file for VC++ application project 
// generated using an Application Wizard.

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;


void fun2(int *parr)
{
    printf(" size of array is %d\n",sizeof(parr));
}
void fun1(void)
{
    int arr[100];
    printf(" size of array is %d\n",sizeof(arr));
    fun2(arr);
}

int extractBit(int byte, int pos) 
{
    if( !((pos >= 0) && (pos < 16)) )
    {
        return 0;
    }
    return ( ( byte & (1<<pos) ) >> pos);
}
int extractBitRange(int byte, int startingPos, int offset) 
{


   if(  !(((startingPos + offset) >= 0) && ( (startingPos + offset) < 16)) )
   {
        return 0;
   }
   return ( byte >> startingPos ) & ~(0xff << (offset + 1));
}

int _tmain()
{
    // TODO: Please replace the sample code below with your own.

    int value;
    signed int res,bit;
    signed int stPos, len;
    value = 0x1155;
    printf("%x\n",value);
    //Console::WriteLine("Hello World");
    //fun1();
    for(bit=15;bit>=0;bit--)
    {
        res =extractBit(value,bit);
        printf("%d",res);
    }
    stPos = 4;
    len = 5;
    res = extractBitRange(value, stPos, len);
    printf("\n%x",res);

    return 0;
}
于 2012-10-16T14:01:28.557 に答える
0
unsigned int extract_n2mbits(unsigned int x, int n, int m)
{
unsigned int mask, tmp;
if (n < m) {
    n = n + m;
    m = n - m;
    n = n - m;
}
mask = 1 << (n - m + 1);
tmp = m;
while (tmp > 1) {
    mask = mask << 1 | 1 << (n - m + 1);
    tmp = tmp - 1;
}
return ((x & mask) >> (n - m + 1));
}
于 2013-02-06T21:30:54.457 に答える