二进制取位操作。(愚蠢的人:书到用时方恨少)

昨天写了一个关于位运算的困扰,今天又学习了一下才知道自己是多么的无知和愚蠢。

昨天的困惑:

16进制数:0X06AA4C

换算成24位2进制数:000001101010101001001100

数据定义:

//0~4 共5bit 春节日份

//5~6 共2bit 春节月份

//7~19 共13bit 13个月的大小月情况(如果无闰月,最后位无效),大月为1,小月为0

//20~23 共4bit 记录闰月的月份,如果没有闰月为0

进行取位运算得到月份和日期:

//计算春节的公历日期

     int spring_ny_month = ( LUNAR_YEARS[year_index] & 0x60 ) >> 5;  //取月份
     int spring_ny_day = ( LUNAR_YEARS[year_index] & 0x1f);  //取日期

我的疑惑为什么第一行能取到月份?为什么第二行能取到日期?

愚蠢的我所犯的错误:

000001101010101001001100把这个二进制数的左边当做低位。这是错误的根本。右边才是低位,那一切问题就都解决了。

0x60的二进制是01100000与上面的24位数进行位与运算,后再右移5位即得到24位数中的第6、7位,即月份,与原数据定义是相符的。日期的算法也就清楚了。

 

注:二进制的取位操作  (原理很容易理解,我却不知道)

逻辑与运算:两个数都为1时结果为1。

想取哪几位把那几位进行和1进行与运算,再移位即可。

如上面月份的计算:与0x60(二进制01100000)进行与运算,因为是第6、7位,所以要再右移5位。

日期计算:与0x1f(二进制:00011111)进行与运算,因为在最右边5位,所以不用移位。

 

 

 

 

 

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kim5659

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值