unsigned long long n = 0;
for (int i = 0; i <= 64; i+=2)
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
このコードの 3 行目が実際に何をしているのかを理解しようとしています。誰かがこれをクリアするのを手伝ってください!
unsigned long long n = 0;
for (int i = 0; i <= 64; i+=2)
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
このコードの 3 行目が実際に何をしているのかを理解しようとしています。誰かがこれをクリアするのを手伝ってください!
その行は、nの i番目のビットを設定します。
1ULL
unsigned long long 型の整数 1 です。<<
ビットシフト演算子です。は 2 i1ULL << i
に等しいか、バイナリで i 個のゼロを使用します。100...0
n |= x;
複合代入演算子です。それは書くことに似ていn = n | x;
ます。|
はビットごとの OR 演算子です。ウィキペディアには、一般的なケースでビットごとの OR 演算子がどのように機能するかを示す例があります。
0101 (decimal 5)
OR 0011 (decimal 3)
= 0111 (decimal 7)
関連している
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
On the right hand side you have "1ULL" which is a constant 1 unsigned long long
. You are left bit shifting "1ULL" i number of times
. The result of the left shifting of "1ULL" will then be matched with n to perform a bitwise OR. So n will be set to (n | (1ULL << i))
.
This entire line or operation is setting the ith bit of n to a 1.
|= 1ULL << i
単にi
th ビットを設定することを意味します。for は 2 ビットごとにループするため、64 ビット unsigned long long の 1 つおきのビットが 1 に設定されます。
つまり、 のようなビット パターンが得られます...0101010101
。
1 を i 桁左にシフトし、その結果を n で OR します。実際には、ビット i を n に設定しています。
これは、i の値だけシフトされた値 1 ビットで n をバイナリ OR 演算します。
n の (バイナリ) 値は次のようになると思います。
0101010101010101010101010101010101010101010101010101010101010101
テストはしていませんが、ループが完了したとき..