本帖最后由 大漠小鸟 于 2024-11-12 19:33 编辑
我有个朋友学了挺久编程了,一直搞不懂位或、位与、左移、右移,只会简单的搬用,需要自己做位运算应用时大脑就萎缩了这会挺有激情的,写个详细的位运算过程分享给大家,希望有帮助。
一、二进制
大家或多或少应该都有了解过二进制吧,简单来说就是字面意思哈,理解不了回炉再造!!!二进制、二进制、逢二进一,十进制就是逢十进一,依此类推。
以易语言为例(其它语言一样),最小单位是字节,但在计算机中他的单位是位,一个字节=8位,一个整数=4个字节(32位)
1个字节=8位=0000 0000,这个就是二进制
字节 | 二进制 | 0 | 0000 0000 | 1 | 0000 0001 | 2 | 0000 0010 | 3 | 0000 0011 | 255 | 1111 1111 | 所以一个字节可以表示0-255,因为1个字节=8位,二进制中8位全部为1了,无法再继续表示了,要表示更多就要扩大位数,比如扩大到短整数型(16位)或整数型(32位)
二、左移
知道上面的二进制后,我们再了解左移过程,左移也是字面意思,将二进制向左移动指定位数
2=左移(1,1)
将1向左移动1位,结果:2
0000 0010 = 2
-------------------
如果是左移2位呢?
0000 0100 = 4
-------------------
看明白了吗,很直观了吧
三、右移
右移和左移原理一样,只不过是相反的,它是向右移动
0000 0000 = 0
-------------------
0000 0001 = 1
-------------------
小提示:
左移可以做乘法:左移1位=*2,左移2位=*4;3位=*8;4位=*16;...
右移可以做除法:...
不过必须是2的n次幂,也就是2、4、8、16、32、64...
很多场景中会用到的左移、右移、来实现乘除法,因为位运算会比乘除法效率更高
四、位与
位与过程如下:如果两个位为1,结果为1,否则为0
例子1:
0 = 位与(170,85)
1010 1010 = 170
0101 0101 = 85
---------------------
0000 0000 = 0
例子2:
20 = 位与(20,63)
0001 0100 = 20
0011 1111 = 63
---------------------
0001 0100 = 20
0001 0010 = 目录属性 =18
0001 0000 = #子目录 = 16
--------------------
0001 0000 = 16
目录属性和#子目录的二进制位存在两个相同的1位,那么这个目录属性属于文件夹而非文件
五、位或
|