Компилятор gcc
интерпретирует тип данных char
как целое число, и это имеет смысл... Есть ли функция сравнения для сравнения битовых строк?
char a='0';
char b= 0b11111111;
if (a<b) {/* never goes here! */}
if (bitStringCompare(a,b)) {/* this kind of "native" function exists? */}
Лучший способ решить мою проблему из реальной жизни — объявить a
и b
с другим типом данных, который на самом деле является битовой строкой, например (предположим) ASN1TDynBitStr
, но я не вижу для него побитово-лексикографического сравнения.
ПРИМЕЧАНИЯ
Лексикографический порядок строк битов переменной длины:0
‹ 00
‹ 01
‹ 1
‹ 10
‹ 11
где все элементы представляют собой строки битов (например, 0b10
, но с 0!=00), они не ASCII. струны.
Для математиков, используя формальное определение, каждая строка представляет собой слово из алфавит из 2 букв.
std::lexicographical_compare
не кажется решением, потому что не является побитовым.
Важно: мне нужна хорошая производительность, поэтому (для моего приложения) недопустимо преобразовывать биты в ASCII 0
s и 1
s. Мне нужно быстрое и побитовое лексикографическое сравнение.
Предложение (придумать оптимальное решение): при разделении длинной строки битов на n кусков (например, с более чем 32 битами и менее чем с 1024 битами) сканирование с помощью i =0 to n-1... Возможно, более быстрый подход заключается в использовании быстрой функции по частям (например, chunck x_i
из 32 битов) для проверки a_i==b_i
, их ( когда a_i!=b_i
) используйте побитовую функцию, чтобы вернуть a_i<b_i
.
Лексикографическое сравнение строк битов a_i==b_i
возможно для числовых (беззнаковых) типов данных при объединении битов 1
: например, для сравнения 0000==0
мы можем использовать 0b10000
==ob10
.
is_less_than(to_string_base2(integer_a), to_string_base2(integer_b))
, но эффективно, без преобразования в строку? Я прав? Если да, то как получить такие строки, как00
или01
? Функции преобразования числа в строку обычно не записывают начальные нули? - person PSkocik   schedule 09.06.2019