: ビット単位の操作を使用して構造体のメンバーを操作する方法は?構造については、例えば
struct name{
int a;
char b;
float c;
}g;
g.b='X';
は今はビット演算子を使用して構造部材b
(<<
、>>
等)にアクセスし、'A'
に変更したいと思います。 このような演算子を使用して構造体メンバーにアクセスすることはできますか?
: ビット単位の操作を使用して構造体のメンバーを操作する方法は?構造については、例えば
struct name{
int a;
char b;
float c;
}g;
g.b='X';
は今はビット演算子を使用して構造部材b
(<<
、>>
等)にアクセスし、'A'
に変更したいと思います。 このような演算子を使用して構造体メンバーにアクセスすることはできますか?
構造体のビット演算は、パディングのためにはあまり意味がありません。さらに重要なのは、構造体を最初に配置する目的を殺すことだけです。ビット単位の演算は、変数をビット単位で操作するという名前と同じです。構造体変数は通常(パックされていない場合)パディングされるので、パックするまではアクセスする場所は保証されませんが、できるかどうかを確認したい場合は可能ですが、キャスト構造体gを32ビットの値とし、2つの変数がこの空間にある場合は、このキャストされた値に対してビット演算を使用できます。必要であれば、構造体から共用体を作成し、生の変数を1つの共用体のパーツとして使用し、構造体を別のオプションとして使用して、生変数のビット単位で操作できます。
bのオフセットを取得してデータを変更することができます。私は知っている、このコードはよく見えません。しかし、それはあなたの目的に役立ちます。
#include <stdio.h>
struct name
{
int a;
char b;
float c;
}g;
int main()
{
g.b='X';
int y=0;
int offset = &((struct name *)NULL)->b; // Find Offset of b
char *p = (char *)&g;
int i=0;
for(i=0;i<offset;i++)
{
++p;
}
*p=*p|(1<<0);
// *p = 'A';
printf("........%c\n",g.b);
}
こんにちは、良い仕事Sumit。私はあなたのコードから、charポインタを使ってバイト単位でアクセスすることによって、特定のメンバ内部の構造体にアクセスする方法を理解しました。しかし、あなたは私がビットでメンバーにアクセスするのを手伝ってもらえますか?この質問は会社のインタビューで尋ねられたので、私は興味があります! – abinjacob
@abinjacob自分のコードを変更しました。しかし、私はインタビュアーが構造的に提出されたビットについて尋ねていたと思っていて、koper89はパディングのために構造体のビットワイズ演算が意味をなさないと語った。 –
構造体のメンバーにアクセスする演算子は、 '.'と' - > 'のみです。 –
'g.b = 'A''を実行する代わりに、' someoperation(g)=' A''のようなものが欲しいのですか? – Iluvatar
はいIluvatar。個々のメンバーにアクセスしてビット単位の操作を使用します。 – abinjacob