目录
一、运算符:
1.与 x&y:对应位均为1的时候才为1,否则为0
用途:①测试某一位是0/1: x&2==2?..........
②只保留某些位上的1
③把特定位上的数置0
2.或 x|y:对应位均为0的时候才为0
用途基本同1(没有①;②③把1/0互换就行.
3.异或^:同0异1
用途:①与全1异或——翻转0和1 与0异或——不变
②与自己异或——0
③与自己异或两次——不变
④互换xy的值:x=x^y;y=y^x(此时y=原来的x;x=x^y(此时x=原来的y。
例题:
解析:将这n个正整数一起异或,相同的就相当于抵消掉了,最后的结果就是那个落单的那个
int n,result=0,x;
cin>>n;
for(int i=0;i<n;++i)
{cin>>x;
result^=x;
}
cout<<result;
4.取反 ~x:逆转01位
5.按左位移x<<1
6.按右位移x>>1:
无符号和有符号的正数:正常移动
负数:补的数取决于所使用的系统(补0:逻辑右移;补1:算术右移
这告诉我们:对负数进行位运算的时候,要注意是否要先变成无符号形式(unsigned
用途:用来与2的n次方进行*/运算,加快效率(*2的n次方:1<<n
二、综合使用:
1.二进制转换
①n&1;n>>1;(从低位到高位即从末尾开始(与二进制码相反) 也可以据此判奇偶
有多少输出多少个数字
如果要对n进行位运算,应该是写n>>=1!!!!!气死了你个**
(或者:n&(1<<i[i从15取到0] ) !=0 ;(从高位到低位 16个数字
②cout<<(n<<i[i从15取到1]<0)(顺序由i来决定,如果i从大到小,那就是从高位到低位的顺序,即输出值就是二进制码
(这个不行啊 这个应该是根据符号位来判断01的,但是现在编译器里面好像是32位还是怎么,得到的结果永远都是>0的)
2.毒酒问题
解析:将酒按二进制编号,一共需要十位(2的十次方-1)
取十只老鼠,让每只老鼠喝对应位上为1的所有酒,最后每一位老鼠都能确定一个位上的数字。(类似于取交集:没死的老鼠证明没有喝到毒酒——毒酒这一位上是0才会没有喝到;死了的老鼠喝到了毒酒——因为这一位上是1所以被喝到了)