C++ビット演算操作
昨日leetcodeのビット運算問題をしました.以前はたまに使っただけで、システムを見たことがありません.今日見てみました.ビット演算関連アクション:論理演算子:&(ビット"と")and^(ビット"異和")|(ビット"または")or~(ビット"逆取り")<>>(右シフト)
例題:洛谷p 1100
見れば分かるように、バイナリに変換してループ移動すればいいです.コンピュータ内部のマシンコードはいずれもバイナリであるため、バイナリ操作、すなわち上述したいくつかの操作を直接行うことができる.この問題は直接入力した数に対して操作することができて、先に取り出してから16ビットは左に移動して、更に前の16ビットを取って右に移動して、多く出たビット数は自動的に0を補います.コードは次のとおりです.
なぜ
leetcode 5308について.または、演算の最小反転数リンク:https://leetcode-cn.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/タイトル:
上のコード:
考え方:本題ではまず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
例題:洛谷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