Компилятор 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
<<code>00 <<code>01 <<code>1 <<code>10 <<code>11где все элементы являются битовыми строками (например, 0b10
, но с 0! = 00), они не являются строками ASCII.Для математиков, использующих формальное определение 1028 *, каждая строка представляет собой слово алфавита с 2 буквами.
std::lexicographical_compare
не кажется решением, потому что оно не ориентировано на биты.
Важно: мне нужна хорошая производительность, поэтому недопустимо (для моего приложения) преобразовывать биты в ASCII 0
с и 1
с.Мне нужно быстрое и побитовое лексикографическое сравнение.
Предложение (воображаемое оптимальное решение): при делении большой битовой строки на n кусков (например, сбольше 32 бита и меньше 1024 бита), сканирование с i = от 0 до 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
.