私はJavaでこのコードに出くわしました。誰かが私にロジックを説明してくれたらうれしいです.
public boolean name(int n) {
return ((n >> n) & 1L) > 0;
}
これは一種のチェック操作だと思いますが、このコードが返すブール値は何ですか。そして、このコードに代わるものはありますか。Javaでのビット操作を理解するために最善を尽くしています。
私はJavaでこのコードに出くわしました。誰かが私にロジックを説明してくれたらうれしいです.
public boolean name(int n) {
return ((n >> n) & 1L) > 0;
}
これは一種のチェック操作だと思いますが、このコードが返すブール値は何ですか。そして、このコードに代わるものはありますか。Javaでのビット操作を理解するために最善を尽くしています。
それは奇妙なコードです。n
右n % 32
ビットにシフトされた数値 が奇数かどうかをチェックします。
通過する最初の負でない値は、37 (2 進数で 100101)、70 (2 進数で 1000110)、および 101 (2 進数で 1100101) です。
元のコーダーが意図したとおりに実際に機能するとは思えません-明らかに有用なものを意味するものではありません(そしてメソッド名name
はかなり役に立ちません...)
おそらく、このパズルのポイントは、0 から 31 ビットの外側にシフトすることを検討するかどうか、そして何が起こるかを確認することでした。
負の数の場合はさらに奇妙になります。
for(int n=-70;n<=200;n++)
if (((n >> n) & 1L) > 0)
System.out.print(n + " ");
版画
-70 -69 -68 -67 -66 -65 -58 -57 -56 -55 -54 -53 -52 -51 -50 -49 -48 -47 -46 -45 -44 -43 -42 -41 -40 -39 -38 -37 -36 -35 -34 -33 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 37 70 101 102 135 165 167 198 199
n
が_int
n & (1 << (n & 31)) != 0
n
だったらlong
n & (1L << (n & 63)) != 0
より負の数は、符号が拡張されるため、シフト後に 1 が設定されます。
似たようなパズル
http://vanillajava.blogspot.co.uk/2012/01/another-shifty-challenge.html
http://vanillajava.blogspot.co.uk/2012/01/shifting-challenge.html
正の数値の場合、数値が次の形式である場合、関数は true を返すようです。
sum_k (alpha_k * 2^k + d(k)), where
alpha_k = 0 or 1
k >= 5
d(k) = k for exactly one of the k where alpha_k = 1 and 0 otherwise
例:
alpha_k = 1 for k = 5, 0 otherwise => 32 + 5 = 37
alpha_k = 1 for k = 6, 0 otherwise => 64 + 6 = 70
alpha_k = 1 for k = 5 and 6, 0 otherwise => 32 + 5 + 64 = 101
or 32 + 64 + 6 = 102
等
これらの数値はすべて機能します。
% 32 だけその数値をシフトすると、null でない k に対して d(k) だけシフトされます。
位置 1 に移動するビットは位置 k にあり、定義により 1 です (alpha_k = 1)
これらの数値だけが機能することを証明することは、もう少し難しいことです...
次の質問は明らかに: ポイントは何ですか?!
>>
符号付き右シフト演算子、左オペランドはシフトする整数、右オペランドは整数をシフトするビット位置の数です。最終& 1L
操作は 0 番目のビットをテストします。0 番目のビットが 1 の場合、関数は true を返します。これの真の目的は私にはわかりませんが、この関数が true を返す結果のセットはオペランドのサイズに依存します。(n >> n)
32 の倍数に対してゼロ以外の結果を返し、次に ...
32: (n>>n): 32 (n>>n)&1L: 0
33: (n>>n): 16 (n>>n)&1L: 0
34: (n>>n): 8 (n>>n)&1L: 0
35: (n>>n): 4 (n>>n)&1L: 0
36: (n>>n): 2 (n>>n)&1L: 0
37: (n>>n): 1 (n>>n)&1L: 1
or
192: (n>>n): 192 (n>>n)&1L: 0
193: (n>>n): 96 (n>>n)&1L: 0
194: (n>>n): 48 (n>>n)&1L: 0
195: (n>>n): 24 (n>>n)&1L: 0
196: (n>>n): 12 (n>>n)&1L: 0
197: (n>>n): 6 (n>>n)&1L: 0
198: (n>>n): 3 (n>>n)&1L: 1
199: (n>>n): 1 (n>>n)&1L: 1