Меню

Сравнение битовых последовательностей числа



Сравнение произвольных битовых последовательностей в байтовом массиве в c

У меня есть пара массивов uint8_t в моем коде c, и я хотел бы сравнить биты произвольной последовательности от одного к другому. Например, у меня есть bitarray_1 и bitarray_2, и я хотел бы сравнить биты 13–47 из bitarray_1 с битами 5-39 из bitarray_2. Какой самый эффективный способ сделать это?

В настоящее время это огромная проблема в моей программе, так как у меня просто наивная реализация, которая копирует биты в начало нового временного массива, а затем использует memcmp для них.

5 ответов

Три слова: сдвиг, маска и xor.

сдвиг, чтобы получить одинаковое выравнивание памяти для обоих bitarray. Если нет, вам придется сдвинуть один из массивов, прежде чем сравнивать их. Ваш пример, вероятно, вводит в заблуждение, потому что биты 13-47 и 5-39 имеют одинаковое выравнивание памяти на 8-битных адресах. Это было бы неверно, если бы вы сравнивали, скажем, биты 14-48 с битами 5-39.

Как только все выровнено и превышены биты, очищенные для границ таблицы, достаточно xor, чтобы выполнить сравнение всех битов одновременно. По сути, вы можете сделать это только с одним чтением памяти для каждого массива, что должно быть довольно эффективным.

Если выравнивание памяти одинаково для обоих массивов, как в вашем примере, memcmp и специальный случай для верхней и нижней границ, вероятно, еще быстрее.

Также доступ к массиву с помощью uint32_t (или uint64_t на 64-битных архитектурах) также должен быть более эффективным, чем доступ с помощью uint8_t.

Принцип прост, но, как сказал Андрей, реализация не безболезненна.

Вот как это происходит (сходство с предложением @caf не случайно):

Все возможные оптимизации еще не использованы. Одним из многообещающих будет использование больших порций данных (64 бита или 32 бита одновременно вместо 8), вы также можете обнаружить случаи, когда смещение синхронизировано для обоих массивов, и в таких случаях использовать memcmp вместо основного цикла, замените по модулю% 8 на логические операторы & 7, заменить ‘/ 8’ на ‘>> 3’ и т. д., нужно заменить ветви кода вместо замены s 1 и s2 и т. д., но основная цель достигнута: чтение только одной памяти и не запись в память для каждого элемента массива, поэтому большая часть работы может выполняться внутри регистров процессора.

Источник

Сравнение указанных последовательностей битов в двух разных заданных числах

Определить, сколько битов в числах N1 и N2 различаются
Определить, сколько битов в числах N1 и N2 различаются. Вывести номера позиций этих битов.

Подсчитать количество цифр в двух заданных целых числах
Как подсчитать количество цифр в двух заданных целых числах? P.S.: Не используя функции работы со.

Построить объединение двух заданных последовательностей
Даны натуральное число n, целые числа а_1,…,а_25,b_1,…,b_n. Среди а_1,…,а_25 нет повторяющихся.

Читайте также:  Размер касатки по сравнению с человеком

БПФ и сравнение двух генетических последовательностей
Надеюсь, что тут мне помогут. Написал БПФ, но теперь даже в голову не приходит, как мне.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Из двух заданных последовательностей образовать новую согласно условию
Даны две последовательности a_1 ≤ a_(2 )… ≤ a_(n ) и〖 b〗_1 ≤ b_(2 )… ≤ b_(m ).Образовать из них.

В массиве найти произведение двух заданных последовательностей чисел; полученные произведения сравнить
Доброго времени суток, нужен полный код си++ для задания: Одномерный массив X(8) задать в.

Сравнение двух разных классов
Всем доброе время суток, у меня задача такая стоит: «Сравнить два разных переменных разных классов.

Из двух целых чисел А и B собрать одно, состоящее из четных битов A и нечетных битов B.
Нужна помощь с задачей. Из двух целых чисел А и B собрать одно, состоящее из четных битов A и.

Источник

Сравнение знаковых и беззнаковых чисел

Как бы абсурдно это не выглядело, но результатом выполнения этой программы будет строка «1 -1», так как числа будут интерпретироваться с учетом знака.

И вот что мне совершенно непонятно, так это почему в языке выбрано именно такое неочевидное и провоцирующее ошибки поведение при сравнении знаковых и беззнаковых целых чисел?

Как создать шаблон функции отдельно для знаковых и беззнаковых чисел
Имеется задача, создать шаблонную функцию для конвертации числа в строку. Но проблема в том, что.

Из массива беззнаковых байтов в массив знаковых
Выручайте. Вопрос такой, как получить из массива беззнаковых байтов массив знаковых. Считываю.

Сравнение двух знаковых чисел
задание такое:нужно сравнить два знаковых числа. числа в пределах от -9 до 9, т.е. надо сделать.

[TASM] Не работает сравнение знаковых чисел
Здравствуйте, проверьте пожалуйста сравнение знаковых чисел. Нужно найти максимальное из 3-х чисел.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

[TASM] Сравнение целых знаковых чисел
Здравствуйте, не мог бы кто-нибудь привести примеры сравнения целых знаковых чисел. Заранее спасибо.

Вычитание беззнаковых чисел
При выполнении вот этого кода ,у меня вывод 4294967292 ,не могу понять почему ,помогите пожалуйста.

Генератор 4-знаковых чисел
Добрый день, написал генератор , генерирует числа с 4 знаками. Подскажите , как дописать проверку.

Ввод знаковых чисел в массив
Знаком с Ассемблером совсем недавно, и научился заполнять массивы только символами. Работать с.

Источник

Побитовое сравнение

Объясните пожалуйста на пальцах. У меня есть маска в двоичном представлении 0000 0100 , я хочу во время когда пользователь вводит число, например : 4 что в двоичном равно маске, получать true , во всех остальных случаях false . Делаю вот так :

В этом случае я получаю всегда true когда бит другого числа, 2 разряда, равен 1, а как мне сделать что бы я получал true только тогда когда 2-е разряды обоих чисел совпадают, а все остальное равно 0? Или я не правильно понимаю работу с битами?

Читайте также:  Сравнение графических редакторов проект

2 ответа 2

Битовые маски применяются для того, чтобы проверить в числе только интересующие нас биты. А на остальные не обращать внимания.

проверка, что в числе установлены те биты, которые установлены в MASK_DAY . Значение остальных бит нас не интересует

в числе не установлены те биты, которые установлены в MASK_DAY

проверка, что все не установленные биты MASK_DAY сброшены и в num

проверка, что все установленные биты MASK_DAY установлены и в num , а не установленные — сброшены

Повторять уже написанное не буду, но некоторые уточнения внесу.

1. Битовые (поразрядные) операции в качестве результата возвращают число.

это означает, что если вы, например, выполнили операцию

то переменная res будет содержать 0x04

2. В C# в условном операторе if допустимы только логические выражения

Это означает, что мы не можем использовать результат поразрядной операции (число) в качестве условия для if , поэтому нам необходимо использовать логическую (результат типа bool [true/false]) операцию сравнения == для проверки, что после применения поразрядной операции получилось нужное число.

В большинстве случаев достаточно простых логических операций сравнения. Битовые операции имеет смысл использовать тогда, и только тогда, когда вас интересует состояние конкретных бит в числе, например в случае упаковки нескольких логических переменных в одно число с целью экстремальной экономии памяти.

Источник

Битовое сравнение чисел

Поиск чисел в строках и сравнение этих чисел
Здравствуйте. Помогите пожалуйста с задачей: есть файл, в нём несколько строк. В каждой строке.

Битовое И
Добрый день. Изучаю битовые операции, в частности битовое И. Вот в чём вопрос: 3 & 8 = 0, т.к. .

Битовое представление
Здравствуйте! Напишите пример функции, которая принимает целое число и выводит его битовое.

а вот так
4=100
4=100
6=110
и что у нас получается, на первой позиции у нас все 1 значит в новом числе это тоже будет 1, дальше у нас идут 0,0 и 1 они разные, тобиш у нас будет 0 в новом числе на 2 позиции, и в самом конце у нас опять идет совпадение всех битов, а именно 0,0,0 и тогда у нас должно получится число 101, то есть 5

Добавлено через 43 секунды
для решения этой задачи побитового И будет маловато

Добавлено через 2 минуты

Torotorkina, я понял что вы хотите, и чтобы нули типо учитывались, но если вам такое нужно, то Serg_o_Grey, прав, у вас остается 28 бит нулей при данных числах, и они станут еденицами, но если вам именно так и надо(но 5 вы не получите), то вот таблица истинности XOR
x1 x2 | y
________
0 0 0
0 1 1
1 0 1
1 1 0
Она противоположенна тому чего вы хотите, вам нужно сделать инверсию значений XOR и тогда вы получите ваш результат (но еще раз, 5 там не будет)
P.S лично мне кажется что вы не правильно поняли задание, и с нулями работать не нужно так как вы описали

Читайте также:  С чем можно сравнить зеленый цвет глаз

Добавлено через 3 минуты
Torotorkina, и даже вам привели не 32 битовый инт а 16 битовый (short) при инте у вас значение за миллиард залезет если так как вы хотите

Решение

Я думаю не надо быть семи пядей во лбу, чтобы догадаться, что в задаче подразумевается, что ширина результата должна быть равна позиции самого старшего бита в максимальном входном значении. (Полагая, что три нуля — запрещенный вход или правильный результат для трех нулей — 0.)

Поэтому от ширины типа int , short или еще чего-то в этом роде решение данной задачи не зависит

От ветвления внутри цикла можно избавиться (похитив булевское выражение у Mr.X,)

Добавлено через 10 минут
Понятно, что эти битовые операции можно выполнять «параллельно» над всеми битами одновременно. Но тогда для игнорирования ненужных старших битов надо уметь быстро определять номер старшего единичного бита. Не вдаваясь эти дебри, можно предложить такой вариант

Если забыть о переполнениях, то выражение x & (x + 1) может равняться нулю только в одном случае: если число x имеет вид 00. 011. 1 , т.е. состоит из непрерывной последовательности единиц в правой части. В этом случае x + 1 будет иметь вид 00. 100. 0 и операция & даст в результате 0. В остальных случаях результат будет ненулевым.

Этот битовый трюк широко используется для распознания чисел вида 2 n (единственный единичный бит): x & (x — 1) == 0 . И для распознания чисел вида 2 n -1 (вереница единиц справа): x & (x + 1) == 0 .

В нашем случае я хочу взять результат mask = a | b | c и превратить его в битовую маску, состоящую из сплошных единиц начиная со старшего единичного бита mask и вправо до упора. Для этого я могу просто напросто итеративно «размазывать» все единичные биты mask на один шаг вправо — mask |= (mask >> 1) — до тех пор пока mask не приобретет требуемый вид, что проверяется через ((mask + 1) & mask) == 0 .

Этого же самого результата можно было добиться более «тупым» (и, скорее всего, более эффективным) способом

т.е. путем последовательного «размазывания» единичных битов вправо с постоянно удваивающимся шагом, но такая развертка завязана на ширину типа unsigned , а мне не хотелось на нее завязываться.

Ну и, опять же, если вы умеете быстро вычислять индекс старшего единичного бита в значении, т.е. умеете быстро вычислять log2(x) с округлением вниз, то вся функция может быть реализована как

Источник