今天开始学数学。
位运算:
符号 | 用处 | 举例 | |
---|---|---|---|
单目 | ~ | 按位非 | ~000000 = 111111 |
! | 整体非 | !0=1 | |
双目 | | | 按位或 | 0101|0010 = 0111 |
& | 按位与 | 0011&1010 = 0010 | |
^ | 异或 | 5^3 = 6 |
但是这样并不一定能满足做题的需要,将上述符号进行简单的排列组合,有:
A同或B:~(A^B)//注意,此时高位有可能会出现大量1
A后n位按位取反:
auto temp(auto a, int n){ if(n==maxn)return ~a; return ((1 << n) - 1) ^ a;//若n为最大时,会越界 } /* 110101 n 0100101//原数 110101 n 1011010//所求数 000000 1111111//(1 << n) - 1) 使用1<<n时用可能越界,可以改为static_cast<unsigned long long>(1) << n */
题目代码:
#include<iostream> using namespace std; typedef unsigned long long ll; ll n, k; int main() { ios::sync_with_stdio(false);//关个流 cin.tie(0); cout.tie(0); cin >> n >> k; n++; int flag = 1; while (--n) { if (k >= (static_cast<unsigned long long>(1) << (n - 1))) { cout << 1; if (n == 64)k = ~k; else k = (((static_cast<unsigned long long>(1) << n) - 1) ^ k); } else cout << 0; } return 0; }