Как мы можем делать добавление слева FF вместо 00? Например, мы имеем a = E8, нам нужно a = 0xFFFFFFe8
0xFFE26C02 -> 0xFFE26C02
0x000000e8 -> 0xFFFFFFe8
0x100000e8 -> 0x100000e8
0x001000e8 -> 0xFF1000e8
PS тип данных int32 или int64
Вы можете использовать следующее, чтобы преобразовать все ведущие байты 0
в FF
int RevLeadingZeros(int number)
{
if((number & 0xFF000000)==0)
number |= 0xFF000000
else
return number;
if((number & 0x00FF0000)==0)
number |= 0x00FF0000
else
return number;
if((number & 0x0000FF00)==0)
number |= 0x0000FF00
else
return number;
if((number & 0x000000FF)==0)
number |= 0x000000FF
else
return number;
}
Я предполагаю, что ваша проблема заключается в том, как положить биты слева влево "1" в номере?
Вот мое решение:
Возьмем, например, номер 01001000 (как num):
Таким образом, результат (~ num + 1) & num заключается в том, чтобы получить самый правый "1" в номере.
Чтобы получить самый левый, выполните цикл, и условие:
while(num-(~num+1)&num)
В конце вы получите номер 01000000.
Таким образом, будет легко найти "0" справа налево "1".
Надеюсь, это поможет.
Без прямого вычисления вы можете просто перебрать каждый байт целого числа и заменить последний последовательный 00
FF
.
Вы можете также OR
целое число с маской, которая может быть легко построена с первым перемещением вашей целочисленной памяти.