• ベストアンサー

初心者の私にプログラムを教えてください。

以前、No.685451で質問したのですが、自分の質問が悪かったため、あまり理解できなかったので、また教えていただけないでしょうか? 質問は 下の例にもあるように、32ビットのIPアドレス(unsigned long型)と32ビットのハッシュ値(unsigned long型)をビットインターリーブして64ビットの値を作りたいのですが、どのようにプログラムしたらよいでしょうか? また、ビットインターリーブした値が64ビットになり、64ビットの値を格納できる型も分かりません。 このような場合、doubleやlong doubleでビットインターリーブ値を格納するのでしょうか? 質問が多くて申し訳ないのですが、できれば解説などもしてもらえるとありがたいです。よろしくお願いします。 ーーーーーーーーーーーーーーーーーーーーーーーー 例  IPアドレス:192.168.23.5 ⇒(11000000101010000001011100000101) ハッシュ値:11110000101010100101010100001111 ビットインターリーブ(※IPアドレスは奇数ビット、ハッシュ値は偶数ビットとします) :1111010100000000110011001100010000010011001110110000000001110111 ーーーーーーーーーーーーーーーーーーーーーーーー

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

  • ベストアンサー
  • keyguy
  • ベストアンサー率28% (135/469)
回答No.4

前の回答は無償Boralnd C++5.5用のものです。 Linux用ならば #include<iostream> using namespace std; void OutputBinary(const unsigned long long int& x) { for(int i=64;0<i;cout<<(x>>--i&1));cout<<endl; } void main(void) { longlong int a,b,c; a=0xaaaaaaaa; b=0xffffffff; cout<<"a=";OutputBinary(a); cout<<"b=";OutputBinary(b); for(unsigned long long int i=1;i!=0;i<<=2)a+=a&(-i); for(unsigned long long int i=2;i!=0;i<<=2)b+=b&(-i); cout<<"c=";OutputBinary(c=a|b); } とでもしなければなりません。 しかしこれはWindowsではエラーになります。

20centuryboy
質問者

お礼

すごいプログラムですね。とても感動しました。親切に何回も回答していただき本当にありがとうございました。また、機会がありましたらアドバイスをよろしくおねがいします。

その他の回答 (3)

  • keyguy
  • ベストアンサー率28% (135/469)
回答No.3

一箇所写し間違えをしてしまいました。 修正します。 #include<iostream> using namespace std; void OutputBinary(const unsigned __int64& x) { for(int i=64;0<i;i--)cout<<(x>>(i-1)&1); cout<<endl; } void main(void) { unsigned __int64 a,b,c; a=0xaaaaaaaaaaaaaaaa; b=0xffffffffffffffff; cout<<"a=";OutputBinary(a); cout<<"b=";OutputBinary(b); for(unsigned __int64 i=1;i!=0;i<<=2)a+=a&(-i); for(unsigned __int64 i=2;i!=0;i<<=2)b+=b&(-i); cout<<"c=";OutputBinary(c=a|b); } 結果は a=1010101010101010101010101010101010101010101010101010101010101010 b=1111111111111111111111111111111111111111111111111111111111111111 c=1101110111011101110111011101110111011101110111011101110111011101

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

Cでのコーディングを期待していますか? それともC++ですか? OSはWindowsですか?(VC++) VCの場合、64ビット整数は、No1のかたが書いているように__int64になります。 それともUnix(linux)ですか。(gcc) Unixの場合は、long long int型が64ビット整数を示します。 この辺のところも、書いておくと、よい回答が期待できると思いますよ。

20centuryboy
質問者

お礼

long long int型ですか。非常にためになりました。親切に回答していただきありがとうございました。

  • keyguy
  • ベストアンサー率28% (135/469)
回答No.1

前回の回答がほとんどそのまま使えます。 #include<iostream> using namespace std; void OutputBinary(const int& x) { for(int i=64;0<i;i--)cout<<(x>>(i-1)&1); cout<<endl; } void main(void) { unsigned __int64 a,b,c; a=0xaaaaaaaaaaaaaaaa; b=0xffffffffffffffff; cout<<"a=";OutputBinary(a); cout<<"b=";OutputBinary(b); for(unsigned __int64 i=1;i!=0;i<<=2)a+=a&(-i); for(unsigned __int64 i=2;i!=0;i<<=2)b+=b&(-i); cout<<"c=";OutputBinary(c=a|b); } 結果は a=1010101010101010101010101010101010101010101010101010101010101010 b=1111111111111111111111111111111111111111111111111111111111111111 c=1101110111011101110111011101110111011101110111011101110111011101

関連するQ&A