目录
1.位运算概述
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
2.符号
1)与运算 & 有0则0 无0则1 可以用来判断奇偶 x&1==0 说明x是偶数
2)或运算|有1位1 无1为0
3)异或运算 ^ 相同为1 不同为0
4)<< 二进制左移
5) >> 二进制右移
6)~ 取反
3.常用的功能:
1.交换二个数 a^=b^=a^=b;
2.判断奇偶 x&1
3.判断二个数是否相同 a^b==0 说明ab相等
4.判断多个数字中只出现一次的数字 ans^=x 多次 最后ans的值就是那个数字
4.运用:
1.描述
给你一个整数数列,保证只有一个数出现过奇数次,输出它。
输入
多组测试数据。 每组测试数据第一行为一个整数n,代表该数列元素个数。(1 <= n <= 500000) 第二行为n个整数ai,以空格隔开。(-1000000 <= ai <= 1000000)
输出
输出一行表示这个出现奇数次的数。
int main(){
int n;
while (cin>>n) {
int ans=0;
over(i,1,n){
int x;
cin>>x;
ans^=x;
}
cout<<ans<<endl;
}
}
2.
题目描述
icebound通过勤工俭学,攒了一小笔钱,于是他决定出国旅游。这天,icebound走进了一个神秘的神殿。神殿由八位守护者守卫,总共由6464个门组成,每一道门后都有一个迷宫,迷宫的大小均为100×100100×100。icebound在迷宫中总共耗时TT小时,消耗食物KK公斤。历经千辛万苦之后,icebound终于穿越了迷宫,到达了神殿的中心。神殿的中心有一个宝箱。宝箱上显示有两个正整数ll和rr。icebound苦思冥想,终于发现一些打开宝箱的线索。你需要找到一个数PP,它具有一个美妙的性质:它是[l,r][l,r]中所有数的二进制表示里,11的个数最多的一个数。如果你发现了这个美妙的数字,你就可以打开宝箱,获得巨额财富。
比如[4,8][4,8]中:
4: 0100
5: 0101
6: 0110
7: 0111
8: 1000
二进制表示中11的个数最多的数是77,它含有33个11。
输入描述
输入一行,两个正整数:ll和rr,用空格隔开,代表神殿中宝箱上显示的数。
1≤T<2311≤T<231,
1≤K≤1051≤K≤105,
1≤l≤r≤2×1091≤l≤r≤2×109
输出描述
一个十进制数P,代表满足条件的解。如果有多个P满足条件,输出最小的P。
样例输入
4 8
样例输出
7
我们可以根据
n|(n+1)一定会比n的二进制多一个一而且还是从低位向高位加一
int main(){
ll l,r;
cin>>l>>r;
while ((l|(l+1))<=r) {
l|=(l+1);
}
cout<<l<<endl;
}