平安网站建设工作总结,自建域名,wordpress 高清头像,义乌公司做网站位运算基础
作者#xff1a;blue
时间#xff1a;2024.3 文章目录 位运算基础1.计算二进制中1的个数2.位运算#xff08;x -x#xff09;x 为偶数x为奇数最终结论用途#xff1a; 一般可以用来获取某个二进制数的LowBit 1.计算二进制中1的个数
nn(n-1) //用…位运算基础
作者blue
时间2024.3 文章目录 位运算基础1.计算二进制中1的个数2.位运算x -xx 为偶数x为奇数最终结论用途 一般可以用来获取某个二进制数的LowBit 1.计算二进制中1的个数
nn(n-1) //用就完了#include iostream
using namespace std;
int count(int n)
{int sum0;while(n){nn(n-1);sum;}return sum;
}
int main()
{int n;int sum0;cinn;sumcount(n);printf(%d,sum);return 0;
}应用0二进制问题 - 蓝桥云课 (lanqiao.cn)
虽然有一半的测试数据会超时但是强在代码容易写而且不用思考先拿一半分数再说
#include iostream
#define int long long
using namespace std;
int count(int n)
{int sum0;while(n){nn(n-1);sum;}return sum;
}
signed main()
{int n,k;int ans0;int sum;cinnk;for(int i1;in;i){sumcount(i);if(sumk) ans;}printf(%lld,ans);return 0;
}2.位运算x -x
~x:按位取反
-x 的值 其实就是在x的值的基础上进行按位取反(~x)之后在增加1所得
x -x x (~x 1)x 为偶数
偶数按位取反后一定是奇数再1会影响进位。
如 0000 0100 1110 取反后的结果就变成了 1111 1011 0001而当这个值 1之后由于发生了进位 即
1111 1011 0001 1 1111 1011 0010这个结果再与最初的值相与后 只会有一位保留为1
0000 0100 1110 1111 1011 0010 0000 0000 0010 如果一个偶数 在执行 x -x的操作的时候 最后结果肯定有如下两个特征
① 这个结果只有一位值是1 其他位均是0 ② 这个值的末位0的个数与原值保持一致
“当一个偶数与它的负值相与时 结果是能整除这个偶数的最大的2的幂, 即 m n -n , 则 n % m 0, 且 m 2 ^ k”
x为奇数
奇数取反后的值一定是偶数 而偶数的值 1之后 并不会影响进位
所以进行x-x后剩下刚加上的那最后一位1
结论“如果是x是奇数 那x -x 的结果一定是1”
最终结论
“当一个数与其取负后的值相与 如果这个数是偶数 则结果是能整除这个偶数的最大的2的幂(即 m n -n , 则 n % m 0, 且 m 2 ^ k) 如果这个数是奇数 则结果必为1”
用途 一般可以用来获取某个二进制数的LowBit
lowbit ( n ) 定义为非负整数 n 在二进制表示下 “ 最低位的 1 及其后面的所有的 0 ” 的二进制构成的数值。
int lowbit(int x)
{return x(-x);
}8.位运算与或非异或
①与运算运算符号为 运算法则为遇0得0。也就是说只要有0结果即为0。
举例1001 1100
1 0 0 1 1 1 0 0 ———— 1 0 0 0
妙用x1可以用来判断二进制数x最后一位是不是1是1就为1不是1则为0
可以用来快速判断奇偶数。
②或运算运算符号为 | 就是一个竖线运算法则为遇1得1。也就是说只要有1结果就为1。
举例1100 | 1010
1 1 0 0 | 1 0 1 0 ———— 1 1 1 0
③非运算预算符号为 ~就是一个波浪线运算法则为按位取反也就是遇1取0,遇0取1即 ~1 0 , ~0 1;
举例 ~1001
1 0 1 1 ~ ———— 0 1 0 0
④异或运算运算符号为 ^就是一个乘方符号运算法则为相同取0不同取1。异或运算关键在异上面异为1否则为0
举例1001 ^ 1001
1 0 1 1 ^ 1 0 0 1 ———— 0 0 1 0
⑤左移与右移
左移很简单的来说就是把当前的二进制整体往左边移动N个单位N取决于你的表达式。
例如32 1 64。右移很简单的来说把当前的二进制整体往右边移动N的单位得到一个新的二进制。
例如32 1 16//用二进制数来表示信号灯的7个灯管用异或运算来模拟灯管的变化
#include stdio.h
#include string.h
const int N 1e5 1;
int check(int x)
{int num0;while(x){num (x 1);x x 1;}return num;
}
int main()
{ //abcdefgint pos[] { 0B1111110,0B0110000,0B1101101,0B1111001,0B0110011,0B1011011,0B1011111,0B1110000,0B1111111,0B1111011 };int i, len;int ans 0;char s[N], t[N];scanf(%s, s);scanf(%s, t);len strlen(s);for(i0;ilen;i){ans check(pos[s[i] - 0] ^ pos[t[i] - 0]);}printf(%d, ans);return 0
}