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
    """
    
    
  • 相关阅读:
    HDU4513 吉哥系列故事——完美队形II Manacher算法
    POJ3974 Palindrome Manacher算法
    POJ1674 Sorting by Swapping 置换群
    100个著名初等数学问题[转载]
    POJ1026 Cipher 置换群
    FOJ1977 Pandora adventure 插头DP
    HDU1964 Pipes 插头DP
    POJ1286 Necklace of Beads polya计数
    Manacher算法O(n)回文子串算法[转载]
    POJ3270 Cow Sorting 置换群
  • 原文地址:https://www.cnblogs.com/xueweisuoyong/p/11874444.html
Copyright © 2011-2022 走看看