操作符的一些基本介绍和使用详解

本文详细讲解了位操作符如按位与(&), 按位或(|), 按位异或(^)的使用规则,以及移位操作符的逻辑与算术区别。通过实例演示了如何利用这些概念进行数值操作,包括位移判断和数值交换技巧。特别提醒了移位运算对负数的处理规则。
摘要由CSDN通过智能技术生成

移位操作符

左移操作符 移位规则:

左边抛弃、右边补0

右移操作符 移位规则:

首先右移运算分两种:

  1. 逻辑移位 左边用0填充,右边丢弃
  2. 算术移位 左边用原该值的符号位填充,右边丢弃

警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:

int num = 10;
num>>-1;//error

并且左移右移操作符只适用于整型,比如:

int main()
{
	int a = 10;
	int b = a >> 1;

	float c = 4.5f;
	c >> 1;//error


	return 0;
}

编译器报错。

位操作符

& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。

看代码学知识:

int main()
{
	int a = 3;
	int b = -2;
	int c = a & b;
	//00000000000000000000000000000011   - a的补码
	//11111111111111111111111111111110  - b的补码
	//00000000000000000000000000000010  - 按位与(只有两个都是1才是1,其他都是0)


	//10000000000000000000000000000010  - b的源码
	//11111111111111111111111111111101  - b的反码
	//11111111111111111111111111111110  - b的补码
	int d = a | b;
	//00000000000000000000000000000011   - a的补码
	//11111111111111111111111111111110   - b的补码
	//11111111111111111111111111111111   - 按位或补码(只要有一个1就是1,只有两个零才是0)
	//11111111111111111111111111111110 - 补码减一
	//10000000000000000000000000000001 //除了符号位,其他位全部取反。
	//打印结果是-1
	printf("%d", d);


	int e = a ^ b;//二进制异或
	//异或 - 相同为0,相异为1
	//00000000000000000000000000000011
	//11111111111111111111111111111110
	//11111111111111111111111111111101
	//11111111111111111111111111111100  - 减一
	//10000000000000000000000000000011  - 打印-3


	int k = 15;
	a & 1;
	a = a >> 1;
	//00000000000000000000000000001111
	//00000000000000000000000000000001
	//00000000000000000000000000000001 - 按位与
	//然后向右移>>
	//00000000000000000000000000000111
	//由此可见,这方法可以判断15的二进制位有多少个1;
	return 0;
}

不能创建临时变量(第三个变量),实现两个数的交换。

int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;// 可以理解为 b = a ^ b ^ b = a ^ 0 = a
 a = a^b;// a = a ^ b ^ a(因为b里面已经是a得数) a = b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

但这个有局限性,可读性差。

由上面的代码可以知道,异或是有交换律的
例如:

a^a = 0;
0 ^a = a;
000
011
011

a ^a ^b = b
a ^b ^ a = b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值