C++ビット演算操作


昨日leetcodeのビット運算問題をしました.以前はたまに使っただけで、システムを見たことがありません.今日見てみました.ビット演算関連アクション:論理演算子:&(ビット"と")and^(ビット"異和")|(ビット"または")or~(ビット"逆取り")<>>(右シフト)
例題:洛谷p 1100
      2^32     。        32        (  32  0  )。           16  “  ”, 16  “  ”。        ,           。          (      )。
  , 1314520       00000000000101000000111011011000(   11   0   32 ),   16    , 0000000000010100; 16    , 0000111011011000。          ,             
00001110110110000000000000010100。       249036820。
    
    2^32     
    
      

見れば分かるように、バイナリに変換してループ移動すればいいです.コンピュータ内部のマシンコードはいずれもバイナリであるため、バイナリ操作、すなわち上述したいくつかの操作を直接行うことができる.この問題は直接入力した数に対して操作することができて、先に取り出してから16ビットは左に移動して、更に前の16ビットを取って右に移動して、多く出たビット数は自動的に0を補います.コードは次のとおりです.
#include 
#include 
#include 
using namespace std;
int main() {
    long long x;
    cin >> x;
    cout << ((x & 0x0000ffff) << 16 | (x & 0xffff0000) >> 16) << endl;
    return 0;
}

なぜ(x & 0x0000ffff) << 16なのか試してみましょう.1314520を例に挙げると、x << 16を直接使うと発見される数は86148382720で、バイナリに変換するのは1010000001110110110000000000000000000です.この数字は32ビットではありません.つまり、1314520をバイナリに変換した上で、末尾に16個の0を追加しただけです.(x & 0x0000ffff) << 16の機会を使用して、前の16の位置を0にし、後の16の位置をそのままにして、後に移動すればいいです.移動後、xの値は変わらないので、前の16の位置を右に移動して、最後にしたり演算したりして必要な答えを得ることができます.
leetcode 5308について.または、演算の最小反転数リンク:https://leetcode-cn.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/タイトル:
        a、b   c。
     a   b              ,             a OR b == c           。
「     」                    1    0    0    1 。
、

上のコード:
class Solution {
public:
    int minFlips(int a, int b, int c) {
        int ans = 0;
        int k = a | b;
        for (int i = 0; i < 31; ++i){
            int kk = k >> i & 1;  //  k  i 
            int cc = c >> i & 1;  //  c  i 
            int aa = a >> i & 1;  //  a  i 
            int bb = b >> i & 1;  //  b  i 
            if (kk != cc) {
                if (cc == 0 && aa == 1 && bb == 1) ans += 2;
                else ans++;
            }
        }
        return ans; 
    }
};

考え方:本題ではまずkを求め,kを用いてcに位置するように比較し,同時に2つの状況に分けなければ,1つはaとbに対して変化が必要であり,変化の回数は2を加える必要があり,もう1つは1を加える必要がある.cのビットが0に等しい場合、aとbの対応する位置がいずれも1であれば、いずれも0に変更する必要があるため、2回変更する.演算子優先度参照:https://www.cnblogs.com/ywl925/p/3710246.html