Если вам нужны основы, скажите, что у вас есть шестнадцатеричное число:
4444333322221111
Мы разбили его на 4 части на бумаге, поэтому осталось только извлечь их.Это включает использование маски ffff
для блокировки всего остального, кроме нашего числа (f
ничего не маскирует, 0
маскирует все) и скольжение по каждой части.Таким образом, у нас есть:
part 1: 4444333322221111 & ffff = 1111
part 2: 4444333322221111 & ffff0000 = 22220000
part 3: 4444333322221111 & ffff00000000 = 333300000000
part 4: 4444333322221111 & ffff000000000000 = 4444000000000000
Осталось только удалить 0 в конце.В общем, в C вы бы написали это как:
int GetPart(int64 pack, int n) // where you define int64 as whatever your platform uses
{ // __int64 in msvc
return (pack & (0xffff << (16*n)) >> (16*n);
}
Таким образом, вы вычисляете маску в основном как 0xffff (2 байта), перемещенные вправо на 16 * n бит (0 для первого,16 для 2-го, 32 для 3-го и 48 для 4-го), примените его к числу, чтобы замаскировать все, кроме интересующей нас части, затем сдвиньте результат обратно на 16 * n бит, чтобы очистить эти 0 вконец.
Некоторое дополнительное чтение: Битовые операторы в C .
Надеюсь, это поможет!