学为所用

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

  在物联网实际应用项目开发中,为了提升性能,与设备端配合,往往最终使用的是二进制字节串方式进行的通信协议封装,更会把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
"""

作者:学为所用
本文为博主原创,未经允许不得转载。若博主同意转载的但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
posted on 2019-11-16 22:42  学为所用  阅读(3607)  评论(1编辑  收藏  举报