bitwisefun 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python2
  2. from __future__ import print_function
  3. import sys
  4. SYMBOLS = {
  5. '>>': 'bin_shift_right',
  6. '<<': 'bin_shift_left',
  7. '&': 'bin_and',
  8. '|': 'bin_or',
  9. '^': 'bin_xor',
  10. '~': 'bin_not',
  11. }
  12. def format_binary(num):
  13. """Shows instructive binary format, e.g. 1 byte."""
  14. return '{:08b}'.format(num)
  15. def bin_not(num):
  16. """Bitwise OR."""
  17. return ~num1
  18. def bin_and(num1, num2):
  19. """Bitwise AND."""
  20. return num1 & num2
  21. def bin_or(num1, num2):
  22. """Bitwise OR."""
  23. return num1 | num2
  24. def bin_xor(num1, num2):
  25. """Bitwise XOR."""
  26. return num1 ^ num2
  27. def bin_shift_left(num1, num2):
  28. """Bitwise left shift."""
  29. return num1 << num2
  30. def bin_shift_right(num1, num2):
  31. """Bitwise right shift."""
  32. return num1 >> num2
  33. if __name__ == '__main__':
  34. try:
  35. symbol, num1, num2 = sys.argv[1:]
  36. num1 = int(num1)
  37. num2 = int(num2)
  38. try:
  39. func = SYMBOLS[symbol.lower()]
  40. func = globals()[func]
  41. except KeyError:
  42. print('Invalid symbol: "{}"'.format(symbol))
  43. print('\nValid symbols are:')
  44. for sym in SYMBOLS.keys():
  45. print('\t' + sym.upper())
  46. sys.exit(1)
  47. raw_out = func(num1, num2)
  48. except ValueError:
  49. symbol, num1 = sys.argv[1:]
  50. num2 = None
  51. if symbol != '~':
  52. raise
  53. num1 = int(num1)
  54. raw_out = bin_not(num1)
  55. ret = '\t'
  56. ret += format_binary(num1)
  57. ret += ' (decimal {})'.format(num1)
  58. ret += '\n{}\t'.format(symbol.upper())
  59. if num2:
  60. ret += format_binary(num2)
  61. ret += ' (decimal {})'.format(num2)
  62. ret += '\n----------------\n\t'
  63. ret += format_binary(raw_out)
  64. ret += ' (decimal {})'.format(raw_out)
  65. print(ret)