32 ビット互換のコードを 64 ビットに変換していますが、問題が発生しました。VS2008 x64 プロジェクトをコンパイルすると、次の警告が表示されます。
warning C4334: '<<' : result of 32-bit shift implicitly converted to 64 bits
(was 64-bit shift intended?)
元のコード行は次のとおりです。
if ((j & (1 << k)) != 0) {
Microsoft のアドバイスに従うと、次のようになります。
if ((j & (1i64 << k)) != 0) {
コードが 32 ビット システムと 64 ビット システムの両方でコンパイルされる場合、これを行っても安全ですか? もしそうなら、最後に「i64」を追加しなければならない理由と、これが 32 ビット コンパイルに影響しない理由を説明してください。それ以外の場合は、回避策を提供していただければ幸いです。
これを超えて、さらにトリッキーなコードのように見えるものがあります。
if (id[j] != id[j ^ (1u << k)]) {
「u」は数字が符号なしであることを意味することは理解していますが、符号付き最大値を超えない値でそれを指定する意味は何ですか...これはビットシフトと関係があると思いますか?