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

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
"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学为所用

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

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

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

打赏作者

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

抵扣说明:

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

余额充值