基本的なビット演算子のみを使用して、21、81、35、123 などの任意の数値を指定して、10 進数の最後の桁が 1 であるかどうかを判断するにはどうすればよいですか?
私の目的は、シフトだけでなくxor
、などのビット操作に慣れることです。and
私が直面している問題は、10 進数で終わっていなくても、一部の数値に最下位ビットが設定されていることです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