Python读字节某一位的值,设置某一位的值,二进制位操作

网友投稿 353 2022-06-21


在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把0和1、True和False、Yes和No这样的布尔值每8个只占用一个字节,用字节中的位来表示。减少传输量,减少对网络稳定性的要求。这就带来了要怎么读某个字节中每一位的值和怎么设置每一位的值的问题。

  这几天再写培训演示代码,顺便就写了两个函数,解决字节位值读写问题,现在分享给大家。

  下面直接上代码,在Python3上测试通过:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

def get_bit_val(byte, index):

"""

得到某个字节中某一位(Bit)的值

:param byte: 待取值的字节值

:param index: 待读取位的序号,从右向左0开始,0-7为一个完整字节的8个位

:returns: 返回读取该位的值,0或1

"""

if byte & (1 << index):

return 1

else:

return 0

def set_bit_val(byte, index, val):

"""

更改某个字节中某一位(Bit)的值

:param byte: 准备更改的字节原值

:param index: 待更改位的序号,从右向左0开始,0-7为一个完整字节的8个位

:param val: 目标位预更改的值,0或1

:returns: 返回更改后字节的值

"""

if val:

return byte | (1 << index)

else:

return byte & ~(1 << index)

print(get_bit_val(3, 2)) # 3的2进制00000 0 11,2号位是0,打印结果0

print(get_bit_val(3, 1)) # 3的2进制000000 1 1,1号位是1,打印结果1

print(get_bit_val(3, 5)) # 3的2进制00 0 00011,5号位是0,打印结果0

print(set_bit_val(3, 2, 1)) # 3的2进制00000 0 11,2号位改成1,打印结果7(00000111)

print(set_bit_val(3, 1, 0)) # 3的2进制000000 1 1,1号位改成0,打印结果1(00000001)

print(set_bit_val(3, 5, 0)) # 3的2进制00 0 00011,5号位改成0,打印结果3(00000011)

"""

控制台输出:

0

1

0

7

1

3

"""

作者:学为所用

出处:http://cnblogs.com/xueweisuoyong/


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:理解闭包(闭包的闭包)
下一篇:python基础(33):线程(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~