位运算



位运算:

1.按位与:a&b

2.按位或:a|b

3.按位异或:a^b

4.按位取反:~a

5.左移:a<<b

6.带符号右移:a>>b

7.无符号右移:a>>>b(Java)C没有这个符号




1.and运算符&


通常用于二进制取位操作,例如:一个数and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制最末位为0的为偶数,为1的为奇数。


boolisEvenNum(num)


{


      return !(num & 1)


}


101101----45


010110----22


----------


000100----4


2.or运算符|


1101101---109


1011001--89


-------


1111101--125


or运算通常用于二进制特定位上的无条件赋值,例如:一个数or1的结果就是把二进制最末位强行变成1,如果需要把二进制最末位变成0,对这个数or1之后再减1就可以了,其实际意义就是把这个数强行转变成最接近的偶数。


1101101


0000001


3.异或运算^


1011011----91


0100101--37


-------


1111110---126


相同为1,不同为0


 


异或运算交换两个数的值


a = a ^b


b = a^b


a = a^b


4.取反运算


b = ~a


5.左移运算


在二进制后面添加n0


左移n


a*(2^n)


6.右移运算


去掉后面n


右移n


a/(2^n)



示例代码:


//@biref 是否是偶数
bool isEvenNum(int num)
{
	return !(num & 1);
}
//@biref 转换为最近的偶数,被转换的数可以是偶数,只不过,结果是他自己而已
int toEventNum(int num)
{
	int result = 0;
	//需要用括号将“|”运算括起来,不然,结果不对
	return (num | 1) - 1;
}

void selfSwap(int &a,int &b)
{
	a = a^b;
	b = a^b;
	a = a^b;
}

int main()
{
	//位运算
	//1.and运算&
	//计算101101&010110 = 000100
	int a = 45 & 22;
	cout << "a=" << a << endl;
	//2.or运算|
	for (int i = 0; i < 100;i++)
	{
		cout << "Num:" << i << ",EvenNum:" << toEventNum(i) << endl;
	}
	//3.xor运算^,异或运算
	int b = 2;
	int c = 5;
	cout << "a=" << a << ",b=" << b << endl;
	selfSwap(a, b);
	cout << "a=" << a << ",b=" << b << endl;
	//4.not运算,取反
	int d = 100;
	d = ~d;
	int g = 300;
	g = ~g;
	unsigned int e = 100;
	e = ~e;
	unsigned int f = 300;
	f = ~f;
	cout << "d=" << d << "e=" << e<<",f="<<f<<",g="<<g<<endl;
	//5.<<运算,左移运算,左移一位,相当于乘以2,
	//通常认为,左移一位的效率要比乘以2要高,因为,位运算更接近底层。
	//因此,在程序中用到乘以2^n的操作尽量用左移为运算来操作
	int h = 5;
	h = h << 2;
	//h * 2^n:n是左移的位数,
	//101101
	//左移两位
	//10110100---加两个0
	cout << "h=" << h << endl;
	//6.>>运算,右移运算,想办法用右移运算代替出发运算,会使代码效率大大提高
	int i = 200;
	i = i >> 2;
	//i / (2^n)
	//11001000
	//右移2位
	//110010
	cout << "i=" << i << endl;

	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值