精易论坛

标题: 关于二进制、左右移、位与、位或理解。 [打印本页]

作者: 大漠小鸟    时间: 2024-11-12 19:21
标题: 关于二进制、左右移、位与、位或理解。
本帖最后由 大漠小鸟 于 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 0001 = 1
0000 0010 = 2
-------------------
如果是左移2位呢?
0000 0001 = 1
0000 0100 = 4
-------------------
看明白了吗,很直观了吧


三、右移
右移和左移原理一样,只不过是相反的,它是向右移动
0000 0001 = 1
0000 0000 = 0
-------------------
0000 0100 = 4
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

  
' 例子3:使用位与来判断文件属性是否为文件夹
目录属性 = 取文件属性 (“D:\dir”)  ' 只读+隐藏的文件夹,其目录属性为18
判断 (位与 (目录属性, #子目录 ) ≠ 0)
调试输出 (“是文件夹”)
调试输出 (“是文件”)


i支持库列表   支持库注释   
spec特殊功能支持库

0001 0010 = 目录属性 =18
0001 0000 = #子目录 = 16
--------------------
0001 0000 = 16
目录属性#子目录的二进制位存在两个相同的1位,那么这个目录属性属于文件夹而非文件



五、位或
  
255=位或 (85, 170)
' 位或:两个位中有一个1返回1,否则为0
' 0101 0101 = 85
' 1010 1010 = 170
' ---------------
' 1111 1111 = 255



i支持库列表   支持库注释   
spec特殊功能支持库









作者: 绝食    时间: 2024-11-12 21:56
重温一下,谢谢分享,辛苦了!
作者: 易造轮    时间: 2024-11-14 11:40
能否讲解位运算可以运用在哪些情况
作者: 大漠小鸟    时间: 2024-11-14 21:25
易造轮 发表于 2024-11-14 11:40
能否讲解位运算可以运用在哪些情况

比如:
常见的位或、位与使用,可以方便的区分权限场景
值=位或(1,2,4,8,16,32,64)
如果真(位与(值,1)!=0)’包含1
如果真(位与(值,2)!=0)’包含2
如果真(位与(值,16)!=0)’包含16
---------------------------------------------
掩码=0b1111=0xF=15
二进制=0b10101010
二进制=位与(二进制,掩码)
此时二进制=0b00001010
清除指定位的值
--------------------------------------------

还有各类编码、算法中会大量用到各种位运算
如:base16(十六进制)、base32、base64编解码过程均会用到

甚至可以说几乎所有函数、算法内部的实现都离不开位运算,且位运算是非常高效的


作者: 原始世界    时间: 2024-11-16 14:40
对我这新手来说还是难懂
作者: xjwlkj    时间: 2024-11-17 09:53
感谢楼主分享!
作者: h1003591791    时间: 2024-12-3 10:49
感谢分享
作者: 真IKUN    时间: 2024-12-13 06:08
支持,YYDS~
作者: 真IKUN    时间: 2024-12-15 16:18
好东西,感谢楼主分析,收藏了
作者: releee    时间: 2025-3-25 21:59
精辟,解释的很好!
作者: 涤尘    时间: 2025-4-17 22:50
谢谢分享,学习一下




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4