different-orプロパティの使用
性質:ある数nが与えられたとき、n^n=0、n^0=n、そして恒等式は交換法則と結合法則を満たします。
使用シナリオ
アイデア:まず配列を1ビット拡張し、同時にそのビットを0に代入します。その後、配列の添え字と要素をすべて微分し、その結果を欠損値とします。
例えば、長さ9の配列[0,1,3,4,5,6,7,8,9]を[0,1,3,4,5,6,7,8,9,0]に拡張し、配列の要素と添え字、つまり0^0^1^1^2^3^3^4^4^5...に対して同型変換を行います。.8^9^9^0となり、欠損値である2が得られます。
、英字を小文字に変換するための演算とスペースの使用
('a' | ' ') = 'a'
('A' | ' ') = 'a'
, オペレーションとアンダースコアの使用は、大文字の英字に変換されます。
('b' & '_') = 'B'
('B' & '_') = 'B'
、英語の文字の大文字と小文字の変換のための異なるまたは操作とスペースの使用
('d' ^ ' ') = 'D'
('D' ^ ' ') = 'd'
原理:各文字はASCIIコード表の数字に対応しており、これらのビット演算によって、その文字に対応する数字を別の文字に対応する数字に変換し、その文字を別の文字に変換することができます。
、2つの整数が同じ符号ビットを持つかどうかを判断するには
int x = -1, y = 2;
bool f = ((x ^ y) < 0); // true
int x = 3, y = 2;
bool f = ((x ^ y) < 0); // false
原理:表現の特性の補数を使用してコンピュータの使用は、1の負の数の符号は、0の正の数の符号は、異なる後、または2つの数値の元の符号が同じである場合、ビットのシンボル数の結果は0、つまり、正の数res>0です;それ以外の場合は、ビットの符号は1、つまり、負の数、つまり、res<0です。
注:読者は、2つの束の掛け算や割り算を使って判定することができると思うかもしれませんが、このような処理では結果がオーバーフローする危険性があるため、そうではありません。
以下はビット操作の例です。
int a = 1, b = 2;
a ^= b;
b ^= a;
a ^= b;
// さて= 2, b = 1
n&アルゴリズム問題はよく使われます!!!!
役割: 数nの2進数表現の最後の1を0に変更します。
以下のn、n-1、n&の2進表現は、n&がどのように関数を実装しているかを明らかにしています。
1) アルゴリズム 問題1:数nの2進表現にいくつの1があるか計算しなさい。
int hammingWeight(int n) {
int res = 0;
while (n != 0) {
// 0数の2進補数はすべてのビットで0である。
n = n & (n - 1);
res++;
}
return res;
}
2) アルゴリズム 問題2:ある数値が2の指数であるかどうかを判定します。
事前知識:ある数値が2の指数である場合、その数値の2進表現には1しかありません。
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
return (n & (n - 1)) == 0; // 演算子の優先順位がよくわからない場合は、ここ()のように括弧をつけることをお勧めする。
}
ビットコンピューティングのブラックアートについてもっと知りたい方は、こちらをご覧ください:
これは海外のサイトで、ビット操作の使用法が非常に多く集められています。





