電子書籍の厳選無料作品が豊富!

struct test {
  int i[2];
};

struct test t;


と、定義した構造体に対して、

t <<= 8;

t = ~t;

などの様にまるごとビット演算を行うことはできますか。

A 回答 (8件)

できません。


struct型に対するシフト命令や反転命令は未定義のはず

unsigned int *p = t;

t[0] <<=8;
t[0] = ~t[0];

とかならできます。
    • good
    • 1

構造体に対してのビット演算は、「できない」というよりも、「定義されていない」です。


なので、その動作はjohnsmith_さんが定義する必要があります。
他の誰も「正解」は持ち合わせていません。

void shift_left(struct test *pt,int s);

struct test t;
t.i[0]=1;
t.i[1]=2;
shift_left(&t,8);
printf("%d\n",t.i[0]);
printf("%d\n",t.i[1]);
とした場合に、どういった結果が欲しいのかでshift_leftの中身を決定する形になります。
    • good
    • 0
この回答へのお礼

定義されてないのですね。
ありがとうございました。

お礼日時:2010/03/16 23:26

具体的に、何がしたいかにもよりますが、



long long 型が使用可能であれば、
long long t;
で、不通に乗り切れるという可能性もあるかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
説明が不足していました。
やりたかったことは任意の内容、大きさの構造体にたいしてのビット演算処理です。
すみませんでした。

お礼日時:2010/03/16 20:24

Cではできないのはすでに回答にあるとおりですが、気になる点が。



>ここで******さんが直接正解を教えてくださる方が、
>これから私が自分で体感するよりもよほど手っ取り早いと思います。
いいえ。
「自分で実行し理解する」ということを放棄した時点で逆です。
その考え方がある時点で「上辺だけわかったつもり」になっておしまいです。

また、「質問すればスグ回答がつく」とも限りません。
QAサイトを「便利な魔法の箱」とでも考えてませんか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>「自分で実行し理解する」ということを放棄した時点で逆です。
>その考え方がある時点で「上辺だけわかったつもり」になっておしまいです。

つまり、できるかできないかは自分で実行して理解するべきであるということですね。
「構造体にたいして、ビット演算はできるのか」というのはC/C++の仕様の問題なので定義されているか、されていないかはっきりと決まっているものと思って質問させていただきました。
私は、この様に白か黒か(できるかできないか)はっきり決まっているだろうことがらというのは、「知る」ものであって、自分で実行して「理解」するというようなものではないと思っております。(個人的な意見ですが)

>また、「質問すればスグ回答がつく」とも限りません。
>QAサイトを「便利な魔法の箱」とでも考えてませんか?

教えて!gooのC/C++コーナーでは、今までにあった質問の一覧を見ればわかるとおり難しい質問でなければ、質問してからかなりの短時間で回答をいただくことができます。
とくに、私の質問はC/C++の基本的な仕組みに関する初歩的なものなのですぐに回答してくださる方がいるだろうと思って質問しました。(実際すぐに回答をいただきました)
QAサイトは「魔法の箱」とまではいきませんが、便利なサービスだとは思っています。

お礼日時:2010/03/16 20:39

 こんばんは。



 以下で良ければ参考程度に。

template<typename __Tp = int, size_t __N = 1>
struct test_t
{
typedef test_t<__Tp, __N> _Self;

enum { Count = __N };

__Tp i[__N];

_Self& operator <<= (const __Tp& shl)
{
for(int n = 0; n < __N; ++n)
this->i[n] <<= shl;

return *this;
}

_Self& operator >>= (const __Tp& shr)
{
for(int n = 0; n < __N; ++n)
this->i[n] >>= shr;

return *this;
}

const _Self operator ~() const
{
_Self tmp = *this;

for(int n = 0; n < __N; ++n)
tmp.i[n] = ~tmp.i[n];

return tmp;
}
};

template<typename __Tp>struct test_t<__Tp, 0>;//error

//int[2]の配列にする
typedef test_t<int, 2> Test;

int main()
{
Test a = {1, 2};
a = ~a;
::printf("[operator ~()]\n");
for(int i = 0; i < Test::Count; ++i)
{
::printf("[%d] = %d\n", i, a.i[i]);
}

Test b = {1, 2};
b <<= 8;
::printf("[operator <<=()]\n");
for(int i = 0; i < Test::Count; ++i)
{
::printf("[%d] = %d\n", i, b.i[i]);
}

Test c = {0xffff, 0xffffff};
c >>= 8;
::printf("[operator >>=()]\n");
for(int i = 0; i < Test::Count; ++i)
{
::printf("[%d] = %d\n", i, c.i[i]);
}

return 0;
}
    • good
    • 0
この回答へのお礼

Thank you for giving me a detailed source code for my question.
Now, I can't understand it perfectly because I'm not very
experienced in programming a computer program with C++ language yet.
So I will learn that more.

お礼日時:2010/03/16 23:23

t <<= 8;


がどんな仕様なのか、で作り方が違います。
t.i[0] <<= 8 ;
t.i[1] <<= 8 ;
とも考えられますし、
t.i[0]とt.i[1]をintの倍のビット幅として、全体を <<= 8
とも考えられます。
    • good
    • 0
この回答へのお礼

すみません。説明不足でした。
やりたかったことは、「全体を<<=8」のほうです。

お礼日時:2010/03/14 22:44

>まるごとビット演算を行うことはできますか。



できるかできないか、という話でしたら、
サンプルコードを書いてみて「ご自分で」体感された方が、
こういうところで質問するよりもよほど手っ取り早いと思います。
いかがでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かにそうですが、もう質問してしっまたからには
ここでasuncionさんが直接正解を教えてくださる方が、
これから私が自分で体感するよりもよほど手っ取り早いと思います。
いかがでしょうか。

お礼日時:2010/03/14 22:41

Cならできません。


何度も使うようなら、関数やマクロを使いましょう。

C++なら、演算子のオーバーロードを利用すればできます。
struct test t;って書きかたしてるのでCだと思いますが。
    • good
    • 0
この回答へのお礼

ありがとうございます。
C、C++どちらでもいいので、やり方を教えていただけるとありがたいです。

お礼日時:2010/03/14 19:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報