【发布时间】:2013-10-04 00:29:59
【问题描述】:
在给定任意数字(例如 21、81、35、123)的情况下,仅使用基本的位运算符,我如何确定十进制数的最后一位是否为 1?
我的目标是更熟悉位操作,例如xor、and 以及移位。
我面临的问题是,即使某些数字不以十进制数字 one 结尾,也会设置最低有效位,否则最后一位数字可以用这样的掩码确定:
>>> '{0:08b}'.format( 5 & 1)
'00000001'
>>> '{0:08b}'.format( 500231 & 1)
'00000001'
显然,我有点困惑,想了解如何解决这个问题。示例代码使用 Python,但建议和可能的答案可以使用任何语言,包括自然英语。
到目前为止我所尝试的:
>>> def go():
... for i in [35,123,01,11,21,31,41,51,61,71,81,91,101]:
endswith1(i)
def endswith1(code):
# ...
# xxxxx
# & 00111
# ^ 00001
# 00000
filter = code & 7
isone = filter ^ 1
a = 'and 7: {0:08b}'.format( filter)
x = 'xor 1: {0:08b}'.format( isone )
b = '{0:08b}'.format( code)
one = isone == 0
print '%3d:%s %12s %12s %s' %( code,b, a,x, one)
#return ((code & 7) ^ 1 ) == 0
>>> go()
35:00100011 and 7: 00000011 xor 1: 00000010 False
123:01111011 and 7: 00000011 xor 1: 00000010 False
1:00000001 and 7: 00000001 xor 1: 00000000 True
11:00001011 and 7: 00000011 xor 1: 00000010 False
21:00010101 and 7: 00000101 xor 1: 00000100 False
31:00011111 and 7: 00000111 xor 1: 00000110 False
41:00101001 and 7: 00000001 xor 1: 00000000 True
51:00110011 and 7: 00000011 xor 1: 00000010 False
61:00111101 and 7: 00000101 xor 1: 00000100 False
71:01000111 and 7: 00000111 xor 1: 00000110 False
81:01010001 and 7: 00000001 xor 1: 00000000 True
91:01011011 and 7: 00000011 xor 1: 00000010 False
101:01100101 and 7: 00000101 xor 1: 00000100 False
【问题讨论】:
-
n % 10 == 1有什么问题? -
实际问题是确定一个棋子是否是棋子,其中所有棋子都编码为pawn:01,knight:02,bishop:03,rook:04,女王:05,国王:06和81、82、83、84、85、86为黑人对应。示例函数解决了这个问题,但我认为将函数推广到所有可能的数字会很有趣。我以为问题很简单,但两个小时后,我无法用一个简单的解决方案来解决。
-
n % 10 == 1没有错,但是%不是位运算符。
-
这实际上是一个有趣的问题,我也很想知道答案(好奇......)。我的第一个猜测是看看 % 是如何在基本级别(例如电路)实现的,然后将
n % 10转换为那个。 -
您是否有某些原因不想将片段编码为 2 的幂,从而大大简化了您需要执行的检查?您还可以利用该机制来拥有一个黑色/白色位,从而更容易实现对任一颜色进行操作的代码。