• ベストアンサー

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

以前、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

  • 初心者によるプログラム

    最近学校のパソコンの授業で、Javaをやるようになったのですが、イマイチ分かりません。課題が出るので、自分でソースを作って、コンパイルしてみるのですが、エラーが出てしまいます。自分でエラーの内容が理解できたものもあったのですが、分からないのもありました。そこで、次の問題を教えていただきたいのです。 「学生番号と自分の誕生日の月をinetger型の変数に代入して、それらの変数を用いて学生番号を誕生日の月で割った値をdouble型の変数に型変換するプログラムを作りなさい」 という問題なのです。以下のソースは、自分でできる限り作ってみたものです。学生番号は12345678で、誕生日の月が11とします。 class kadai100{ public static void main(String args[]){ inetger number=12345678; //inetger型に学生番号を代入 inetger birth=11; //inetger型に生年月日の月を代入 double a; //型の宣言 inetger answer=number/birth; //answerは学生番号を月で割った値 a=(int)answer; //answerをaの型より小さくして、aに代入 System .out.println(a); } } コンパイルすると、3、4、6行目に関してのエラーが出ます。一体、何で間違えなのでしょうか?教えてください。あと、inetgerという型についても教えてください。ネットで調べてみたのですが、基本的データ型というのしかなくて、その中には入っていませんでした。

    • ベストアンサー
    • Java
  • メモリを0クリアする方法について

    組み込み系のc言語でメモリを0クリアするには、どのようなプログラムにすればいいでしょうか?アドレス値を格納するポインタの型は、unsigned long型です。 仮に範囲は、0x1f00~0x2000とします。

  • 汎整数拡張の通常の算術型変換

    「汎整数拡張」の「通常の算術型変換」に <一方のオペランドが型unsigned long intをもつ場合、他方のオペランドをunsigned long intに型変換する。> この下に「そうでない場合」が、一方のオペランドが型long intをもつ場合が二つ続きます。 <一方のオペランドが型unsigned intをもつ場合、他方のオペランドをunsigned intに型変換する。> <>2つの例はlong型やint型よりもunsigned型の上位に位置づけています。 例として   if(-1<1u)は偽になります。 何ゆえにunsigned型の上位性をしているのでしょうか。宜しく願います。

  • unsigned long long 型のフォーマット指定子

    unsigned long long 型の変数の値を表示したいのですが、 フォーマット指定子は%ldですか? よろしくおねがいします。

  • VC++6.0でC言語の基本データ型のビット長と範囲をしりたいです

    VC++6.0を使用しています。コマンドラインを使い勉強しているのですが、基本データ型のビット長と使える数の範囲を知りたいです。 たとえば、int型だと32ビットで-32767から32767の範囲の数を扱えるとかを知りたいです。コマンドライン上から調べることはできないのでしょうか? ネットでも書いてあるところがあるならいいのですが、できれば自分の手で調べる方法を見つけたいのです。 ちなみに char, unsigned char, int, unsigned int, short int, unsigned short int, long int unsigned long int, float, double, long doubleなどが知りたいです。 方法を知っている方教えてください。よろしくお願いします。

  • ポインタの演算について

    ポインタの演算に関して質問させて下さい。 unsigned long型のポインタに+1すると実際のアドレスは+4になってしまいます。 ex) unsigned long *a: 0xb7de1000 a+1 : 0xb7de1004 よって、アドレス+1(上では0xb7de1001)に値をかきこみたいのですが、 *(a+1)=ffffffffとすると 0xb7de1004に値が書きこまれてしまいます。 32bitの値を書きこみたいので現在は char *a: *(unsigned long*)(a+1)=ffffffff としているのですが、キャストを使わずに同様のことを実現することは可能でしょうか? ご教授よろしくお願いします。

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • 偶数ビットだけと奇数ビットだけを取り出すプログラム

    Red Hat Linux 9を使用して、C言語のプログラミングをしているのですが、分からないことがありますので質問させて頂きます。 1010101010101010101010101010101010101010101010101010101010101010 上記のような64ビットの値があり、このうち奇数ビットだけと偶数ビットだけを取り出したいと思います。それぞれ32ビットの値になります。 11111111111111111111111111111111 00000000000000000000000000000000 いろいろ考えてみたのですが、アイディアが思い浮かばず困っております。どなたか分かる方アドバイスをよろしくお願い致します。

  • プログラムが動きません。

    プログラムが動きません。 ファイルuniqipにはIPアドレスが書き込まれています。そのファイルからIPアドレスを文字列ipに格納します。 ファイルtmp4には、85.114.143.2 34f4ff4acb18802170a939ae42dcd5ee0eeccda4 のようにIPアドレスとハッシュ値が書き込まれています。 tmp4に現れるIPアドレスで、uniqipに一致するものに対応するハッシュ値を printf("file%d,%s\n",i,hash); の形で出力しようと思いましたが、うまくいきません。 何がまずいのでしょうか? #include <stdio.h> #include <string.h> //ひとつのIPアドレスに現れるユニークなハッシュ値の数をカウントする int main() { FILE *fp,*gp; char ip[269730][16]; char ip2[16]; char hash[42]; int i,j; fp = fopen("uniqip","r"); if(fp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++) { fscanf(fp,"%s",ip[i]); //printf("%s\n",ip[i]); } fclose(fp); ////////////////////////////////////////////////////////////////////////////////////////////////////// gp = fopen("tmp4","r"); if(gp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++){ for(j=0;j<2470766;j++){ fscanf(gp,"%s %s",ip2,hash); printf("%s\n",ip[i]); if(!strcmp(ip[i],ip2)) { printf("file%d,%s\n",i,hash); } } } return 0; }

  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

専門家に質問してみよう