Получение 16 младших и старших разрядов двоичного числа произвольной длины - PullRequest
0 голосов
/ 30 сентября 2018

Итак, проблема, с которой я сталкиваюсь, заключается в получении младших и самых значимых 16 битов из числа более 16 бит, но не обязательно какой-либо определенной длины.

Если бы число было целым числом, которое составляет 32 бита, я думаю, я мог бы просто сделать что-то вроде:

int Num=0xFFFFFFFF
short most = (short)(Num & 0xFFFF0000);
short least =(short)(Num & 0x0000FFFF);

Результат:

most = 0xFFFF минимум = 0xFFFF

Что теоретически должно дать мне короткое 16-битное число с младшими и наиболее значимыми битами.Но проблема в том, что я должен быть в состоянии сделать это для произвольного количества битов, поэтому этот подход не будет работать, потому что он изменит то, что мне нужно, и число с.Есть ли лучший подход к получению этих значений?

Кажется, что есть довольно простой способ сделать это, но я ничего не могу найти в Интернете.

Спасибо

1 Ответ

0 голосов
/ 30 сентября 2018

Перед основной темой.Ваш код имеет неправильный, чтобы получить большинство.вам нужно сместиться вправо на 4.

short most = (short)((Num & 0xFFFF0000) >> 0x10);

Я думаю, вы хотите этот подход.

// lenMost should be in 0 to 32
int[] divide(int target, int lenMost) {
    int MASK = 0xFFFFFFFF;
    int lenLeast = 32 - lenMost;

    int ret[] = new int[2]();
    // get most
    ret[0] = target & (MASK << lenLeast)
    ret[0] >>= lenLeast;
    // get least
    ret[1] = target & (MASK >> lenMost);

    return ret;
}
...