位运算符(与,或,异或,取反,左移,右移)

前言:
符号描述运算规则
&同为1时,结果为1
|同为0时,结果为0
^异或相同为0,不同为1
<<左移各二进位全部左移若干位,高位丢弃,低位补0
>>右移各二进位全部右移若干位,低位丢失,高位补0
~取反0变1,1变0
一、与运算符(&

运算规则:
同为1的时候结果为1,不同的时候结果为0,同为0的时候也为0

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

例如:3 & 4

	3(0000 0011)
&
	4(0000 0100)
	------------
=
	0(0000 0000)
二、或运算符(|

运算规则:
同为0的时候结果为0,同为1的时候结果为1,不相同的时候结果为1(只有同为0的时候结果才为0,其他情况都为1,只要出现1结果就为1)

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

例如: 3 | 4

	3(0000 0011)
|
	4(0000 0100)
	------------
=
	7(0000 0111)
三、异或运算符(^

运算规则:
同为0,不同为1

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

注意:
异或运算不管0还是1,只要遇到相同的就为0,只要遇到不相同就为1

例如:3 ^ 4

	3(0000 0011)
^
	4(0000 0100)
	------------
=
	7(0000 0111)

特例:
异或运算还可以做用于两个数的交换

公式:

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

举例:

1. 定义两个数值性常量a,b
2. a = 3,b = 5
3. 交换a,b的值
4. 输出a,b交换后的结果

步骤一:a = a ^ b

a = a ^ b
a = 3 ^ 5
a = 6
	a(0000 0011) = 3
^
	b(0000 0101) = 5
	-----------------
=
	a(0000 0110) = 6

步骤二:b = a ^ b

b = a ^ b
b = 6 ^ 5
b = 3
	a(0000 0110) = 6
^
	b(0000 0101) = 5
	-----------------
=
	b(0000 0011) = 3

步骤三:a = a ^ b

a = a ^ b
a = 6 ^ 3
a = 5
	a(0000 0110) = 6
^
	b(0000 0011) = 3
	-----------------
=
	a(0000 0101) = 5

步骤四: 输出a,b的值

a = 5
b = 3
第四、左移运算符(<<

运算规则:

1. 左移可看作 ***整数M乘以2的N次方***
2. "<<"右边的数字就是N,左边的数字就表示这个整数M

注意:
移动的数字必须是整数

例如:
二进制移位:3 << 4

 3(0000 0011)待移位的数字
 6(0000 0110)左移第一位,左移一位之后,最右边的将会缺失,所以不足位数,补一位0,最左边将会多出一位,所以舍掉一位
12(0000 1100)左移第二位,最右边再补一位0,最左边再舍掉一位
24(0001 1000)左移第三位,最右边再补一位0,最左边再舍掉一位
48(0011 0000)左移第四位,最右边再补一位0,最左边再舍掉一位

乘法运算:3 << 4

 = 3 * 2⁴ 
 = 3 * 16 
 = 48
第五、右移运算符(>>
1. 右移可看作 ***整数M除以2的N次方*** 
2. "<<"右边的数字就是N,左边的数字就表示这个整数M

注意:

1. 移动的数字必须数整数
2. 右移之后的数字还是整数,不能得到浮点型数值,不能被2的N次方整数的数字,将会丢失精度,得到的结果只会保留整数部分,小数部分会被自动舍掉

例如:
二进制移位:8 >> 2

8(0000 1000)待右移的数字
4(0000 0100)右移第一位,最左边将会缺失一位,不足位数补一位0,最右边将会多出一位,所以舍掉最右边的一位
2(0000 0010)右移第二位,最左边再补一位0,最右边再舍掉一位

除法运算:8 >> 2

= 8 / 2²
= 8 / 4
= 2
第六、换位取反运算符(~

备注:
换位取反比较复杂,目前对于计算机存储负值的情况还不是很明确,这里从网络上找到一个获得取反的公式,这个公式我亲测过,得到的结果是正确的,这里不做过多的讲解,这块以后弄明白了之后再做补充

~a = -(a + 1)

运算规则:

1、遇到0时,结果为1
2、遇到1时,结果为0

参考:
换位取反运算符其他大咖的解读思路

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值