zoukankan      html  css  js  c++  java
  • 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
    """
    
    
  • 相关阅读:
    无法访问计算机XXXX。错误是:库没有注册。
    Unix网卡重启命令
    教你如何进入有密码的 XP 系统
    巧妙恢复被破坏的Windows XP系统文件
    认识容灾备份 构筑一个避风港
    双机热备的实现模式 - 基于共享存储与纯软件方式
    玩大型游戏死机解决方法
    让windows xp开机跳过登陆界面
    在IE7中无法正常访问FTP的解决办法
    STL使用心得
  • 原文地址:https://www.cnblogs.com/xueweisuoyong/p/11874444.html
Copyright © 2011-2022 走看看