Мне нужно написать функцию, которая получит 2 байт и логическое значение:Бит с учетом длиной
filter(int length, uint16_t* A, uint16_t* B, bool checkByZeros)
необходимой логика: длины количества бит для проверки (например, если длина = 9 байтовый массив будет содержать 2 байта) , если это checkByZeros False
функция возвращает true
если:
all the bytes set (=1) in A are also set in B
в примере (длина = 9):
checkByZeros=True, A:000001111, B:000001111 ==> True
checkByZeros=True, A:000001111, B:000011111 ==> True
checkByZeros=True, A:000001111, B:000000111 ==> False
, если это checkByZeros False
функция возвращает true
если: все байты не-множество (= 0) в А также not- установить в B в примере:
checkByZeros=False, A:000001111, B:000001111 ==> True
checkByZeros=False, A:000001111, B:000011111 ==> False
checkByZeros=False, A:000001111, B:000000111 ==> True
реализация вполне naiive, если я перебираю бит за битом байта, но мне нужно быстрее немного OPERAT ионного метода. Любые предложения? Я немного потерян, потому что, рассматривая разную длину, бит-операции должны игнорировать биты, которые расположены после длины
Вы вводите код в 'c' или' C++ '? Это разные языки, и ни один из них не имеет встроенного типа 'byte' – alexeykuzmin0
@ alexeykuzmin0 Я на C++ и в настоящее время вместо байта [] Я использую uint16_t, поэтому значение max max равно 16, но вскоре я изменю реализацию на использовать ** uint8_t * array ** anyways AFAIK операция бит может быть выполнена на любом типе – KitBag
Насколько вы знаете о [побитовых операторах] (http://www.cprogramming.com/tutorial/bitwise_operators.html)? Кажется, что для первого случая (когда 'checkByZeros == true') достаточно простого маскирования и сравнения для равенства должно быть достаточно (' A & B == A'). Этот же метод можно было использовать и для второго случая (с помощью побитового оператора дополнения). –