当前位置:   article > 正文

Python-VBA函数之旅-bin函数

Python-VBA函数之旅-bin函数

目录

1、bin函数:

1-1、Python:

1-2、VBA:

2、相关文章:

个人主页:非风V非雨-CSDN博客

        bin函数在Python中的实际应用场景相当广泛,特别是在涉及底层数据操作、编码转换、位运算以及算法实现时。常见的应用场景有:

1、位运算和掩码操作:当你需要执行复杂的位运算(如与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)等)时,或者需要设置、清除或切换特定位时,bin()可以帮助你直观地查看和操作整数的二进制表示。例如,在处理硬件接口、网络通信协议或优化算法时,位运算非常常见。

2、数据结构和算法实现:在实现某些特定的数据结构和算法时,如哈希表、位图(bitmap)、布隆过滤器(Bloom filter)等,你可能需要处理二进制数据。在这些情况下,bin()可以帮助你调试和验证你的代码是否正确地处理了二进制数据。

3、编码转换和解析:如果你正在处理来自外部源的数据,这些数据可能是以二进制形式表示的,bin()可以帮助你查看和解析这些数据。例如,处理来自传感器的原始数据或解析二进制文件格式时,你可能需要用到这个函数。

4、密码学和加密:在密码学和加密领域,二进制数据非常常见。当你需要理解和处理加密算法中的位操作时,bin()可以帮助你可视化整数的二进制表示,从而更容易地理解算法的工作原理。

5、调试和错误排查:在编写涉及整数和位运算的代码时,bin()可以帮助你快速发现和定位错误。通过比较预期和实际的二进制表示,你可以更容易地找到问题的根源。

6、低级编程和硬件交互:在嵌入式系统编程、硬件接口编程或低级网络通信等场景中,经常需要直接处理二进制数据。bin()函数可以用于将整数转换为二进制字符串,便于理解和处理这些数据。

7、数据压缩和存储:在某些场景下,为了节省存储空间或提高数据传输效率,需要将数据转换为更紧凑的二进制格式。bin()函数可以用于将整数转换为二进制字符串,作为数据压缩或存储的一部分。

8、图形和可视化:在创建二进制图或可视化二进制数据时,bin()函数可以将整数转换为易于处理的二进制字符串格式,方便进一步的数据处理和可视化操作。

        需要注意,虽然bin()函数对于查看整数的二进制表示非常有用,但在实际的生产代码中,你可能不会直接使用它来处理二进制数据。相反,你可能会使用更低级别的库或工具来处理二进制数据,这些库或工具提供了更多的功能和更好的性能。然而,bin()对于快速查看和理解整数的二进制表示仍然是一个非常有价值的工具。

1、bin函数:
1-1、Python:
  1. # 1.函数:bin
  2. # 2.功能:将一个整数转换为前缀以“0b”开头的二进制字符串形式
  3. # 3.语法:bin(x)
  4. # 4.参数:一个整数,即正整数、0和负整数,三者任选其一
  5. # 5.返回值:返回以0b开头的二进制字符串
  6. # 6.说明:
  7. # 6-1、对于负整数,bin()函数会返回带有负号的前缀的二进制字符串
  8. # 6-2、bin()函数用于将整数转换为二进制字符串表示。但需要注意的是,bin()函数只能用于整数类型的数据,如果传入其他类型的数据,将会抛出`TypeError`异常
  9. # 6-3、bin()函数的参数可以是一个带有`__index__()`方法的对象。如果是对象,则会调用该对象的`__index__()`方法来获取整数值
  10. # 6-4、当转换负数时,bin()函数会返回一个以`-0b`开头的二进制字符串。例如,bin(-10)返回的结果是`-0b1010`
  11. # 6-5、bin()函数转换的二进制字符串是无符号的,即不包含正负号。如果需要表示有符号的二进制数,可以使用其他方法进行处理
  12. # 7.示例:
  13. # 应用1:位运算和掩码操作
  14. # 定义一些整数
  15. a = 10 # 二进制:0000 1010
  16. b = 24 # 二进制:0001 1000
  17. # 位运算
  18. # 按位与(&)
  19. print("a & b =", a & b) # 输出:8 (二进制:0000 1000)
  20. # 按位或(|)
  21. print("a | b =", a | b) # 输出:26 (二进制:0001 1010)
  22. # 按位异或(^)
  23. print("a ^ b =", a ^ b) # 输出:18 (二进制:0001 0010)
  24. # 按位取反(~)
  25. print("~a =", ~a) # 输出:-11 (二进制:1111 0100,注意Python中整数是补码表示)
  26. # 左移(<<)
  27. print("a << 2 =", a << 2) # 输出:40 (二进制:0010 1000)
  28. # 右移(>>)
  29. print("a >> 2 =", a >> 2) # 输出:2 (二进制:0000 0010)
  30. # 掩码操作
  31. # 假设我们想要设置a的最低两位为1
  32. mask = 6 # 二进制:0000 0110
  33. a_new = a | mask # 设置最低两位为1
  34. print("a_new =", a_new) # 输出:14 (二进制:0000 1110)
  35. # 假设我们想要清除a的最低两位
  36. mask = ~6 # 二进制:1111 1000
  37. a_new = a & mask # 清除最低两位
  38. print("a_new =", a_new) # 输出:8 (二进制:0000 1000)
  39. # a & b = 8
  40. # a | b = 26
  41. # a ^ b = 18
  42. # ~a = -11
  43. # a << 2 = 40
  44. # a >> 2 = 2
  45. # a_new = 14
  46. # a_new = 8
  47. # 应用2:数据结构和算法实现
  48. # 检查一个数是否为2的幂
  49. def is_power_of_two(n):
  50. # 如果n不为0,并且n与n-1进行位与运算的结果为0,则n是2的幂
  51. return n != 0 and (n & (n - 1)) == 0
  52. # 主函数
  53. if __name__ == '__main__':
  54. # 定义一个整数num,值为16,即2的4次方
  55. num = 16 # 2的4次方
  56. # 打印num是否为2的幂
  57. print(f"{num} 是2的幂吗? {'是' if is_power_of_two(num) else '否'}")
  58. # 打印num的二进制表示
  59. print(f"二进制表示: {bin(num)}")
  60. # 16 是2的幂吗? 是
  61. # 二进制表示: 0b10000
  62. # 实现一个哈希函数
  63. def simple_hash(data):
  64. # 初始化哈希值为0,采用64位无符号整数
  65. hash_value = 0
  66. # 遍历输入数据的每个字符
  67. for char in data:
  68. # 左移5位(相当于乘以32)并加上原来的哈希值以及当前字符的ASCII值
  69. # 这种哈希函数结合了移位和加法操作,增加了哈希的复杂性
  70. hash_value = (hash_value << 5) + hash_value + ord(char)
  71. # 使用位与操作确保哈希值在64位范围内,防止溢出
  72. hash_value &= 0xFFFFFFFFFFFFFFFF
  73. # 返回计算得到的哈希值
  74. return hash_value
  75. # 主函数
  76. if __name__ == '__main__':
  77. # 定义一个字符串作为哈希函数的输入
  78. data = "myelsa"
  79. # 调用哈希函数计算输入数据的哈希值
  80. hash_val = simple_hash(data)
  81. # 打印哈希值
  82. print(f"哈希值: {hash_val}")
  83. # 打印哈希值的二进制表示
  84. print(f"二进制表示: {bin(hash_val)}")
  85. # 哈希值: 4413005419
  86. # 二进制表示: 0b100000111000010010001111001101011
  87. # 应用3:编码转换和解析
  88. def encode_to_bin(num):
  89. """
  90. 将整数编码为二进制字符串。
  91. """
  92. # 使用bin函数,并去掉'0b'前缀
  93. binary_str = bin(num)[2:]
  94. return binary_str
  95. def decode_from_bin(binary_str):
  96. """
  97. 将二进制字符串解析回整数。
  98. """
  99. # 使用int函数,并指定基数为2
  100. num = int(binary_str, 2)
  101. return num
  102. # 主函数
  103. if __name__ == '__main__':
  104. original_number = 42
  105. print(f"原始数字: {original_number}")
  106. # 编码为二进制字符串
  107. encoded_binary = encode_to_bin(original_number)
  108. print(f"编码后的二进制字符串: {encoded_binary}")
  109. # 从二进制字符串解析回数字
  110. decoded_number = decode_from_bin(encoded_binary)
  111. print(f"解析后的数字: {decoded_number}")
  112. # 验证解析是否正确
  113. assert original_number == decoded_number, "解码不正确"
  114. print("编码和解码成功!")
  115. # 原始数字: 42
  116. # 编码后的二进制字符串: 101010
  117. # 解析后的数字: 42
  118. # 编码和解码成功!
  119. # 应用4:调试和错误的排查
  120. def debug_binary_representation(value):
  121. """
  122. 打印一个整数的二进制表示,用于调试和错误排查。
  123. """
  124. print(f"整数值: {value}")
  125. print(f"二进制表示: {bin(value)}")
  126. # 主函数
  127. if __name__ == '__main__':
  128. # 假设我们有一个位操作的问题
  129. x = 5
  130. y = 3
  131. # 进行位与操作
  132. result = x & y
  133. # 使用debug_binary_representation函数查看x, y和result的二进制表示
  134. debug_binary_representation(x)
  135. debug_binary_representation(y)
  136. debug_binary_representation(result)
  137. # 整数值: 5
  138. # 二进制表示: 0b101
  139. # 整数值: 3
  140. # 二进制表示: 0b11
  141. # 整数值: 1
  142. # 二进制表示: 0b1
  143. # 应用5:低级编程和硬件交互
  144. def simulate_hardware_register(value):
  145. """
  146. 模拟硬件寄存器的操作,并返回其二进制表示。
  147. """
  148. # 假设硬件寄存器是一个8位的寄存器
  149. register_width = 8
  150. # 使用bin函数获取二进制表示,并去除'0b'前缀
  151. binary_str = bin(value)[2:].zfill(register_width)
  152. print(f"寄存器值: {value}")
  153. print(f"二进制表示: {binary_str}")
  154. # 主函数
  155. if __name__ == '__main__':
  156. # 假设我们要设置一个硬件寄存器的值为10(二进制:1010)
  157. register_value = 10
  158. simulate_hardware_register(register_value)
  159. # 寄存器值: 10
  160. # 二进制表示: 00001010
  161. # 应用6:数据压缩和存储
  162. def compress_bits(bits):
  163. """
  164. “压缩”一个只包含0和1的整数列表。
  165. 注意:这只是一个示例,并不是真实的数据压缩算法。
  166. """
  167. # 初始化一个变量来存储压缩后的结果
  168. compressed = 0
  169. # 记录当前已经处理了多少位
  170. bit_count = 0
  171. # 遍历整数列表
  172. for bit in bits:
  173. # 通过左移操作将之前的数据“推”到更高的位,并添加新的位
  174. compressed = (compressed << 1) | bit
  175. bit_count += 1
  176. # 可以选择每8位、16位等存储一次压缩后的数据,这里我们每8位存储一次
  177. if bit_count % 8 == 0:
  178. # 使用bin函数来查看当前的二进制表示(仅用于调试)
  179. print(f"Compressed after {bit_count} bits: {bin(compressed)}")
  180. # 在这里,你可以将compressed的值存储或传输到其他地方
  181. # ...
  182. # 重置compressed变量以准备下一个8位的压缩
  183. compressed = 0
  184. # 如果最后不满8位,也打印出来
  185. if bit_count % 8 != 0:
  186. print(f"Final compressed (less than 8 bits): {bin(compressed)}")
  187. # 主函数
  188. if __name__ == '__main__':
  189. bits = [1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0]
  190. compress_bits(bits)
  191. # Compressed after 8 bits: 0b10110011
  192. # Compressed after 16 bits: 0b10101110
1-2、VBA
  1. Rem 模拟Python中bin函数应用2:数据结构和算法实现
  2. Rem 自定义函数,功能:实现一个哈希函数
  3. Function SimpleHash(data As String) As Double
  4. ' 定义一个Double类型的变量来存储哈希值
  5. Dim hashValue As Double
  6. ' 定义循环变量i和字符ASCII码变量charCode
  7. Dim i As Integer, charCode As Integer
  8. ' 初始化哈希值为0
  9. hashValue = 0
  10. ' 遍历输入字符串的每一个字符
  11. For i = 1 To Len(data)
  12. ' 获取当前字符的ASCII码
  13. charCode = Asc(mid(data, i, 1))
  14. ' 更新哈希值,通过左移和加法操作
  15. hashValue = (hashValue * 32) + hashValue + charCode
  16. Next i
  17. ' 返回计算得到的哈希值
  18. SimpleHash = hashValue
  19. End Function
  20. Rem 执行程序,功能:调用相关自定义函数,在立即窗口输出结果
  21. Sub TestRun_1()
  22. ' 定义变量data存储输入字符串,binaryString存储哈希值的二进制形式,hashVal存储哈希值
  23. Dim data As String, binaryString As String
  24. Dim hashVal As Double
  25. ' 设置输入字符串为"win"
  26. data = "win"
  27. ' 调用SimpleHash函数计算哈希值
  28. hashVal = SimpleHash(data)
  29. ' 输出哈希值
  30. Debug.Print "哈希值: " & hashVal
  31. ' 将哈希值转换为二进制形式
  32. binaryString = ConvertToBinary(hashVal)
  33. ' 输出哈希值的二进制表示
  34. Debug.Print "二进制表示: " & binaryString
  35. End Sub
  36. Rem 自定义函数,功能:将字符串转换为二进制形式
  37. Function ConvertToBinary(number As Double) As String
  38. ' 定义一个字符串变量result来存储转换结果
  39. Dim result As String
  40. ' 初始化result为空字符串
  41. result = ""
  42. ' 当number大于0时执行循环
  43. While number > 0
  44. ' 将number的二进制最低位添加到result的前面
  45. result = str(number Mod 2) & result
  46. ' 移除number的二进制最低位
  47. number = Fix(number / 2)
  48. Wend
  49. ' 如果result为空字符串,则赋值为"0"
  50. If Len(result) = 0 Then
  51. result = "0"
  52. End If
  53. ' 返回转换后的二进制字符串
  54. ConvertToBinary = result
  55. End Function
  56. '哈希值: 133166
  57. '二进制表示: 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0

注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行对应的Sub程序即可输出结果。 

2、相关文章:

2-1、Python-VBA函数之旅-any()函数 

2-2、Python-VBA函数之旅-ascii()函数 

2-3、Python-VBA函数之旅-bool()函数 

2-4、Python-VBA函数之旅-bytearray()函数 

Python算法之旅:Algorithm

Python函数之旅:Function

个人主页:非风V非雨-CSDN博客

欢迎志同道合者一起交流学习,我的QQ:94509325/微信:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/625270
推荐阅读
相关标签
  

闽ICP备14008679号