位运算
计算机现在可以存储所有的数字列如整数、浮点数、字符的,运算
这里我已经了解了计算机的01
什么是位运算?
位操作是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)
列如:2*8最高效的计算方式这道面试题,答案就是位运算。
与运算(and或&)
计算机的本质
- 两个为1,结果为1
测试:
1011 0001
1101 1000
与运算
1001 0000
或运算(or或|)
- 一个或两个为1,结果为1
测试:
1011 0001
1101 1000
或运算
1111 1001
异或运算(xor 或 ^)
不一样就是1,一样就是0
测试:
1011 0001
1101 1000
异或运算
0110 0110
非运算(not 或 ~)
0就是1,1就是0,就是我们所谓的取反
测试:
1011 0001
异或运算
0100 1110
通过这些可以完成加减乘除,位运算来实现加减乘除
位运算(移动位)
左移:(shl或<<)
0000 0001 @所有二进制位全部左移若干位,高位就丢弃了,低位就补0
0000 0010
右移:(shr或>>)
0000 0001 @所有二进制位全部右移若干位,低位就丢弃了,正数低位补0,负数低位补1
0000 0000
0000 0001 十进制等于:1
0000 0010 十进制等于:2
0000 0100 十进制等于:4
0000 1000 十进制等于:8
位运算的加减乘除
计算机只认识01
基本数学是建立在加减乘除上的(本质都是加法)。
4+5=?
# 计算机是怎么操着的!
0000 0100
+
0000 0101
=
0000 1001
# 计算机的实现原理
# 第一步:异或,如果不考虑进位,异或就可以直接出结果。
0000 0100
0000 0101
xor
0000 0001
# 第二步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0100
0000 0101
and
0000 0100
# 第三步:将与运算的结果,左移一位, 0000 1000 进位的结果
# 第四步:异或!
0000 0001
0000 1000
xor
0000 1001
# 第五步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0001
0000 1000
and
0000 0000
# 所以最终的结果就是与运算为0的结果的上一个异或运算。
4 + 5 = 9
0000 0100 + 0000 0101 = 0000 1001
4-5=?
# 计算机怎么操作
4 + (-5)
0000 0100
-
1111 1011
=
1111 1111
异或
0000 0100
1111 1011
xor
1111 1111
与
0000 0100
1111 1011
and
0000 0000
最终结果 1111 1111 或 ff 或 -1