位运算常见用法小结
#位运算基本操作符:
|或
&与
^异或
~取反
12.26所学:
1.位运算求绝对值abs()
原理阐述:对于一个正数而言,返回自己即可,对于负数,二进制表示为补码形式,补码形式又是等于反码形式加一
00000…0011表示3
11111…1100+1 表示-3
即1111…1101 所以负数取反后加一即可
int abs(int a)
{
return (a<0? (~a+1):a);
}
2.位运算交换两值
//位运算交换两个数值
void swap(int& a,int& b)
{
a=a^b;
b=a^b;
a=a^b;
}
这个我直接记忆"aba等",一句话的事儿(原理不懂的话举几个栗子,就明白了).
3.位运算判断奇数偶数
规律:当一个数为奇数时,他的最后一位总是1(自己想想是不是这样的?),当它是偶数时,他的最后一位是0,那么我们通过将这个数字与1做与运算来判断他到底是奇_偶数?
//位运算判断奇数偶数,这里假设奇数返回为true,偶数返回false
bool ji_ou(int a)
{
return (a&1==1?true:false) ;
}
4.找出唯一成对的数
Problem:
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。设计一个算法,将它找出来,你能否设计一个算法实现?
思路一
桶排序思想,开数组,空间为1001,依次填入,检验元素个数,当元素个数为二时返回
思路二(位运算精髓)
#include<cstdio>
#include<stdlib.h>
using namespace std;
int main()
{
int result;
int N=11;
int *given;
given=(int*)malloc(sizeof(int)*N);
for