开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 161|回复: 3
收起左侧

[图文资料] 关于二进制、左右移、位与、位或理解。

[复制链接]
结帖率:95% (18/19)
发表于 3 天前 | 显示全部楼层 |阅读模式   福建省宁德市
本帖最后由 大漠小鸟 于 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特殊功能支持库








评分

参与人数 2好评 +1 精币 +3 收起 理由
绝食 + 1 YYDS~!
dwcq + 1 + 2 YYDS~!

查看全部评分


结帖率:95% (18/19)

签到天数: 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编解码过程均会用到

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

回复 支持 反对

使用道具 举报

结帖率:60% (3/5)

签到天数: 6 天

发表于 昨天 11:40 | 显示全部楼层   广东省广州市
能否讲解位运算可以运用在哪些情况
回复 支持 反对

使用道具 举报

签到天数: 11 天

发表于 3 天前 | 显示全部楼层   黑龙江省绥化市
重温一下,谢谢分享,辛苦了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表