2016-08-29 4 views
1

У меня есть список из 64 бит.Анализ битов в python

['11111111', '11111111', '10001111', '11111110', '11011011', '11111111', '01011011', '10000111'] 

Здесь каждый бит представляет собой функцию. Если бит равен 1, то эта особенность поддерживается иначе.

Есть ли способ, были я могу проверить бит и просто возвращает связанный с ним функцию, если это 1.

Input : 1111111

Output: If all bits are one then I need to print all eight features masked in it.

+2

Можете ли вы привести пример ввода и результат вы хотите получить за это? Это поможет нам помочь вам. – Mureinik

+0

Что вы хотите вернуть, указатель элемента? – GoatsWearHats

+0

@KaasiasKomplex сам элемент я должен вернуть – taz

ответ

0

Я думаю, вы могли бы сделать что-то вроде:

bits = ['11111111', '11111111', '10001111', '11111110', '11011011', '11111111', '01011011', '10000111'] 

# to produce features mapping dynamically: 
# features = {i:"feature " + str(i) for i in range(0,64)} 
features = {0: 'feature 0', 1: 'feature 1', 2: 'feature 2', 3: 'feature 3', 4: 'feature 4', 5: 'feature 5', 6: 'feature 6', 7: 'feature 7', 8: 'feature 8', 9: 'feature 9', 10: 'feature 10', 11: 'feature 11', 12: 'feature 12', 13: 'feature 13', 14: 'feature 14', 15: 'feature 15', 16: 'feature 16', 17: 'feature 17', 18: 'feature 18', 19: 'feature 19', 20: 'feature 20', 21: 'feature 21', 22: 'feature 22', 23: 'feature 23', 24: 'feature 24', 25: 'feature 25', 26: 'feature 26', 27: 'feature 27', 28: 'feature 28', 29: 'feature 29', 30: 'feature 30', 31: 'feature 31', 32: 'feature 32', 33: 'feature 33', 34: 'feature 34', 35: 'feature 35', 36: 'feature 36', 37: 'feature 37', 38: 'feature 38', 39: 'feature 39', 40: 'feature 40', 41: 'feature 41', 42: 'feature 42', 43: 'feature 43', 44: 'feature 44', 45: 'feature 45', 46: 'feature 46', 47: 'feature 47', 48: 'feature 48', 49: 'feature 49', 50: 'feature 50', 51: 'feature 51', 52: 'feature 52', 53: 'feature 53', 54: 'feature 54', 55: 'feature 55', 56: 'feature 56', 57: 'feature 57', 58: 'feature 58', 59: 'feature 59', 60: 'feature 60', 61: 'feature 61', 62: 'feature 62', 63: 'feature 63'} 

for ind, bit in enumerate(reversed("".join(bits))): 
    if bit == '1': 
     print "Feature " + features[ind] + " turned on" 

Где с помощью:

  • reversed - потому что биты считываются из LSB в MSB поэтому нам нужно перебирать справа налево.
  • enumerate - потому что мы хотим, чтобы связанный индекс проверял наше сопоставление, что такое имя/атрибуты функции.
  • "".join(bits) - потому что мы хотим иметь возможность присоединиться ко всем элементам в списке к одному истребимому объекту, который мы можем пройти.
0

Вы можете развернет строку в переменной для каждой функции, как :

>>> my_bit = '11111110' 
>>> feat_1, feat_2, feat_3, feat_4, feat_5, feat_6, feat_7, feat_8 = my_bit 
>>> print feat_1, feat_2, feat_3, feat_4, feat_5, feat_6, feat_7, feat_8 
1 1 1 1 1 1 1 0 

Теперь вы можете проверить для каждой функции, как:

if feat_1: 
    # Do something 
else: 
    # Do something else 
0

Решение зависит от вашего способа перечисления функций. если вы перечислить свои функции от 0 до 63, было бы что-то вроде этого:

import math 

testdata = ['11111111', '11111111', '10001111', '11111110', '11011011', '11111111', '01011011', '10000111'] 

def test_feature(data, i): 
     block = math.floor(i/8) 
     pos = i % 8 

     if data[block][pos] == '1': 
       return True 

     return False 

print(testdata) 
print(test_feature(testdata, 0)) 
print(test_feature(testdata, 3)) 
print(test_feature(testdata, 8)) 
print(test_feature(testdata, 17)) 
print(test_feature(testdata, 33)) 
print(test_feature(testdata, 63)) 

Однако, вы можете легко настроить этот метод, чтобы соответствовать другим перечислений.

0

Сначала вы можете сделать список функций.

feat_list = ['f1','f2','f3','f4','f6','f7','f8'] 

bit_list = ['11111111', '11111111', '10001111', '11111110', '11011011', '11111111', '01011011', '10000111'] 

Затем выполните функцию.

def extract_feature(bit_string): 
    result = [] 
    for ind, bit in enumerate(bit_string): 
     if bit == '1': 
      result.append(feat_list[ind]) 
    return result 

Затем используйте цикл, чтобы получить функции для каждой битовой строки.

for bit_string in bit_list: 
    print extract_feature(bit_string) 

Обратите внимание, что это не очень эффективно, но многословен, так что новичок может понять.

0

Я не знаю, я ли я понял точно :)

def extract_features(x, f): 
    return [f[i] for i, elem in enumerate(x) if x[i] == '1'] 


features = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 
x = '11111111'  
y = '10101010' 

print (extract_features(x, features)) 
print (extract_features(y, features)) 

""" 
<Output> 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 
['a', 'c', 'e', 'g'] 
""" 
0
def f0(): print "executing feature0" 
def f1(): print "executing feature1" 
def f2(): print "executing feature2" 
def f3(): print "executing feature3" 
def f4(): print "executing feature4" 
def f5(): print "executing feature5" 
def f6(): print "executing feature6" 
def f7(): print "executing feature7" 


def run_features(mask): 
    for index, bit in (enumerate(mask[::-1])): 
     if bit == '1': 
      features[index]() 

bits = [ 
    '11111111', '11111111', '10001111', '11111110', 
    '11011011', '11111111', '01011011', '10000111' 
] 

features = [ 
    f0, f1, f2, f3, f4, f5, f6, f7 
] 

for mask in bits: 
    run_features(mask) 
    print '-' * 80 
Смежные вопросы