位运算的使用
作者:互联网
位运算符号基础
&
按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|
按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1
^
按位异或
若参加运算的两个二进制位值相同则为0,否则为1
~
取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<<
左移
用来将一个数的各二进制位全部左移N位,右补0
>>
右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0
1.快速幂
求 m 的 n 次方 直接用乘法一个个乘比较低级,可以用位运算进行二分
例:11的13次方 =11的8次方 * 11的4次方 * 11的 1次方
而二进制中8=1000 4=0100 2=0010 1=0001
代码如下
int getpow(int n,int m)
{
int result=1;
int temp=n;
while(m)
{
if(m&1)
{
result=result*temp;
}
temp=temp*temp;
m=m>>1;
}
return result;
}
2.洛谷 1469
题目描述
经过一段时间的紧张筹备,电脑小组的“RP 餐厅”终于开业了,这天,经理 LXC 接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题:筷子!
CX 小朋友找出了餐厅中所有的筷子,但遗憾的是这些筷子长短不一,而我们都知道筷子需要长度一样的才能组成一双,更麻烦的是 CX 找出来的这些筷子数量为奇数,但是巧合的是,这些筷子中只有一只筷子是落单的,其余都成双,善良的你,可以帮 CX 找出这只落单的筷子的长度吗?
输入格式
第一行是一个整数,表示筷子的数量n。
第二行有n 个整数,第 i 个整数表示第 i根筷子的长度 a。
输出格式
输出一行一个整数表示答案。
输入输出样例
输入 #1
9 2 2 1 3 3 3 2 3 1
输出 #1
2
用位运算 异或运算 a^a=0 a^0=a 且异或运算满足结合性和交换律 降低空间复杂度为O(1).
AC代码如下
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,temp;
scanf("%d",&n);//快读
scanf("%d",&temp);
int k=temp;
for(int i=1;i<n;i++)
{
scanf("%d",&temp);
k=k^temp;
}
cout<<k;
}
标签:运算,temp,int,使用,二进制位,筷子,次方 来源: https://blog.csdn.net/qq_30798083/article/details/118786098