Я хочу получить назначенный байт из 32-разрядного целого числа. Я получаю неправильные значения, но я не знаю, почему.
Ограничения к этой проблеме:
должны использовать биты со знаком, и я не могу использовать умножение. Мне нужно знать, что не так с функцией, как показано ниже.
вот функция:
int retrieveByteFromWord(int word, int byte)
{
return (word >> (byte << 3)) & 0xFF;
}
например:
(3) (2) (1) (0) ------ номер байта
Одним словом: 10010011 11001100 00110011 10101000
Я хочу вернуть байт 2 (11001100)
retrieveByteFromWord (word, 2) ---- дает: 11001100
Но в некоторых случаях это неправильно, и это не скажет мне, в каком случае.
Есть идеи?
Вот проблема:
Вы только начали работать в компании, которая внедряет набор процедур для работы со структурой данных, в которой 4 подписанных байта упакованы в 32-разрядный беззнаковый. Байты в слове пронумерованы от 0 (LSB) до 3 (MSB). Вам была назначена задача реализации функции для машины с использованием 2-х арифметических и арифметических сдвигов вправо со следующим прототипом:
typedef unsigned packed_t
int xbyte(packed_t word, int bytenum);
Это предыдущая попытка сотрудников, уволившая его за ошибки:
int xbyte(packed_t word, int bytenum)
{
return (word >> (bytenum << 3)) & 0xFF;
}
А) что не так с кодом?
Б) Напишите правильную реализацию, используя только сдвиги влево и вправо и одно вычитание.
Я сделал B, но все еще не знаю, почему A не так. Это потому, что десятичные числа идут как 12, 15, 19, 55, а затем упаковываются в слова, а потом, когда я их извлекаю, они больше не совпадают? Может быть, поэтому я собираюсь провести некоторые тесты очень быстро ...