3

私たちが知っているように、C言語のcharポインターはメモリをバイトごとにトラバースします。つまり、毎回1バイト、整数ポインターは毎回4バイト(gccコンパイラー)、2バイト(TCコンパイラー)です。

例えば:

char *cptr; // if this points to 0x100
cptr++;     // now it points to  0x101

int *iptr;  // if this points to 0x100
iptr++;     // now it points to  0x104

私の質問は:

ビットごとにメモリをインクリメントするcでビットポインタを作成する方法は?

4

8 に答える 8

7

char は、C における「アドレス指定可能な最小単位」です。それよりも小さいもの (ビットなど) を直接指すことはできません。

于 2012-12-13T19:43:57.077 に答える
5

できません。ポインターを使用すると、ビットを直接操作することはできません。bit *p = 1; p++(貧弱な仮説が 1.125 を返すと本当に期待していますか?)

<<ただし、 、>>、などのビット演算子を使用して、バイト内の特定のビットにアクセスできます|&

于 2012-12-13T19:43:19.297 に答える
3

概念的には、「ビット ポインター」は単一のスカラーではなく、バイト ポインターとそのバイト内のビット インデックスで構成される順序付けられたペアです。これは、両方を含む構造、または 2 つの別個のオブジェクトで表すことができます。それらに対して算術演算を実行するには、モジュラーリダクションが必要です。たとえば、特定のビットより 10 ビット先のビットにアクセスする場合は、ビット インデックスに 10 を加算し、モジュロ 8 で減らし、バイト ポインター部分を適切にインクリメントする必要があります。

ちなみに、歴史的なシステムでは、バイトアドレスではなくワードアドレス可能なメモリしかなくchar *、ワードポインタとワード内のバイトインデックスで構成されていました。これはまったく同じ概念です。違いは、C はchar *バイト アドレス指定可能なメモリを持たないマシンでも提供しますが、組み込みの「ビット ポインター」型を提供しないことです。必要な場合は、自分で作成する必要があります。

于 2012-12-13T21:54:02.897 に答える
3

いいえ。ただし、ビットを 1 つずつ読み取る関数を作成できます。

int readBit(char *byteData, int bitOffset)
{
   const int wholeBytes = bitOffset / 8;
   const int remainingBits = bitOffset % 8;
   return (byteData[wholeBytes] >> remainingBits) & 1;
   //or if you want most significant bit to be 0
   //return (byteData[wholeBytes] >> (7-remainingBits)) & 1;
}

使用法:

char *data = any memory you like.
int bitPointer=0;
int bit0 = readBit(data, bitPointer);
bitPointer++;
int bit1 = readBit(data, bitPointer);
bitPointer++;
int bit2 = readBit(data, bitPointer);

もちろん、この種の機能に一般的な価値がある場合、おそらくすでに存在していたでしょう。ビットごとの操作は、ビットマスクやシフトなどを使用する場合と比較して非常に非効率的です.

于 2012-12-13T20:51:52.480 に答える
2

現代のコンピューターはバイトアドレス指定可能であるため、それは可能ではないと思います。つまり、各バイトに1つのアドレスがあります。したがって、ビットにはアドレスがなく、ポインタはそれを指すことができません。char * とビットごとの演算を使用して、個々のビットの値を決定できます。

本当に必要な場合は、char* を使用してメモリ内のアドレスを追跡するクラスを作成できます。ただし、値が 0000 0111 を超える必要はありません。フットプリント) を使用して、そのバイトのどのビットにいるかを追跡し、必要に応じて機能するように演算子をオーバーロードします。

于 2012-12-13T19:48:14.503 に答える
0

あなたが求めていることが可能かどうかわかりません。ポインターが指すバイトのすべてのビットをトラバースするには、ビットシフトで魔法をかける必要があります。

于 2012-12-13T19:43:34.563 に答える
0

ポインターを使用すると、それは不可能のように見えますが、データの任意のビットを読み書きするには、これを試すことができます。

unsigned char data;

  struct _p

{

unsigned char B0:1;

unsigned char B1:1;

unsigned char B2:1;


unsigned char B3:1;


unsigned char B4:1;


unsigned char B5:1;


unsigned char B6:1;


unsigned char B7:1;

} 

int main()

{


data = 15;


_p * point = ( _p * ) & data;

//you can read and write any bit of the byte with point->BX; ( Ex: printf( "%d" , point->B0;point->B5 = 1;


}
于 2016-01-09T14:23:27.810 に答える
0

システムで使用されるバイトポインターよりもサイズが少なくとも3ビット大きい整数にポインターを常にキャストできます。次に、キャスト後のポインタを 3 ビット左にシフトします。次に、ビット情報を最下位 3 ビットに格納します。

この整数「ビットポインタ」は、通常の算術演算でインクリメントできます。

このようなもの:

#include <stdio.h>

#define bitptr long long
#define create_bitptr(pointer,bit) ((((bitptr)pointer)<<3)|bit) ;
#define get_bit(bptr) ((bptr)&7)
#define get_value(bptr)  (*((char*)((bptr)>>3))) 
#define set_bit(bptr) get_value(bptr) |= 1<<get_bit(bptr)
#define clear_bit(bptr) get_value(bptr) &= (~(1<<get_bit(bptr)))

int main(void)
{
    char variable=0; 

    bitptr p ;
    p=create_bitptr(&variable,0) ;

    set_bit(p) ;    p++ ; //1
    clear_bit(p) ;  p++ ; //0
    set_bit(p) ;   p++ ;  //1
    clear_bit(p) ; p++ ;  //0
    clear_bit(p) ; p++ ;  //0
    clear_bit(p) ; p++ ;  //0
    clear_bit(p) ; p++ ;  //0
    clear_bit(p) ; p++ ;  //0

    printf("%d\n",variable) ;
    return 0;
}
于 2013-10-05T05:49:32.013 に答える