1
0

00-把64个开关装进一个格子.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/env python3
  2. """课前零食:用 8 位显微镜观察 bitset 运算。"""
  3. from __future__ import annotations
  4. WIDTH = 8
  5. MASK = (1 << WIDTH) - 1
  6. def ask(prompt: str, default: str) -> str:
  7. try:
  8. return input(prompt).strip() or default
  9. except EOFError:
  10. return default
  11. def read_bits(prompt: str, default: str) -> int:
  12. raw = ask(prompt, default)
  13. if len(raw) != WIDTH or any(ch not in "01" for ch in raw):
  14. print(f"{raw!r} 不是 {WIDTH} 位 01 串;本次使用 {default}。")
  15. raw = default
  16. return int(raw, 2)
  17. def bits(value: int) -> str:
  18. return format(value & MASK, f"0{WIDTH}b")
  19. def members(value: int) -> list[int]:
  20. return [index for index in range(WIDTH) if (value >> index) & 1]
  21. def show(name: str, value: int) -> None:
  22. print(f"{name:>7} = {bits(value)},集合成员(最低位编号 0)={members(value)}")
  23. def main() -> None:
  24. print("Bitset 显微镜:左边是高位,最右边是编号 0。")
  25. a = read_bits("A(回车为 10110110): ", "10110110")
  26. b = read_bits("B(回车为 01101100): ", "01101100")
  27. show("A", a)
  28. show("B", b)
  29. operation = ask("操作:all / & / | / ^ / << / >>(回车为 all): ", "all")
  30. if operation in ("all", "&"):
  31. show("A & B", a & b)
  32. print(" 每一位都问一次:两盏灯是否同时亮?")
  33. if operation in ("all", "|"):
  34. show("A | B", a | b)
  35. if operation in ("all", "^"):
  36. show("A ^ B", a ^ b)
  37. if operation in ("all", "<<", ">>"):
  38. shift_text = ask("平移多少格(回车为 2): ", "2")
  39. try:
  40. shift = max(0, int(shift_text))
  41. except ValueError:
  42. shift = 2
  43. if operation in ("all", "<<"):
  44. show(f"A << {shift}", (a << shift) & MASK)
  45. print(" 左移出去的 1 不会搬家到另一端;它们离开了这个固定长度集合。")
  46. if operation in ("all", ">>"):
  47. show(f"A >> {shift}", a >> shift)
  48. print(" 右移时低位掉出集合,高位补 0。")
  49. print(f"\n置位数 popcount(A)={a.bit_count()}。8 位是演示,真实一字通常有 64 位。")
  50. if __name__ == "__main__":
  51. main()