これを試して:
#include <iostream>
int main()
{
long long num=0x7fffffff00000000ll >> 32;
// ^^
// Literals are by default int
// need to add ll to let the compiler
// know it is long long
for(int i=63; i>=0 ;--i)
{
long long mask = (1ll << i);
// ^^ Note here I want this to be a long long
// before I start shifting it.
std::cout << ((num & mask)?1:0);
}
std::cout << "\n";
return 0;
}
./a.out
0000000000000000000000000000000001111111111111111111111111111111
あなたのコードを見る:
cout<<(((1<<63)+1)&(/*(long long)*/1<<i)?"1":"0");
そこには定数があります:
int val = (1<<63)+1;
// since these are all integer literals (and I am guessing your platform is 32 bit)
0x00000001 or 000000000000000000000000000000001
したがって、その式の 2 番目の部分でループすると、次のようになります。
/*(long long)*/1<<i
i > 32 の後、結果は未定義ですが、ビットをラップして再び開始しているように見えます。だからあなたは設定しています
10000000000000000000000000000000100000000000000000000000000000001
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Mask bit wrapped around
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The mask on 0x00000001