Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
MoonGuard
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
1

Число uint разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число

30.09.2014, 15:16. Просмотров 962. Ответов 4
Метки нет (Все метки)

Не могу решить следующую задачу:
Есть некоторое число uint (32-bit), его необходимо разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число, в соответствии с ним сделать замену из таблицы, склеить из этого всего обратно 32-битное число.
Я пока не представляю, как можно разбить uint на 8 частей по 4 бита, если подскажите, то буду благодарен.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2014, 15:16
Ответы с готовыми решениями:

Элемент массива преобразовать в число
Всем привет. Такой легкий вопрос. string s="12345"; int a=int.Parse(s);...

Пользователь вводит число, надо разбить число по цифрам
Пользователь вводит число, надо разбить число по цифрам, вывести на экран...

Дано целое число n. преобразовать это число так, что если ...
Дано целое число n. преобразовать это число так что если подрят встречаются 2...

Преобразовать каждое число последовательности чтобы из него получалось наибольшее число
с клавиатуры вводится последовательность трехзначных чисел. Преобразовать...

Преобразовать римское число из строки в число
Вводится строка. Если она является записью римского числа, то преобразовать ее...

4
XRoy
861 / 711 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
30.09.2014, 16:03 2
MoonGuard,
Заводите 4 битовую маску и при помощи битового умножения выделяете нужные биты.

Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        static void Main(string[] args)
        {
            uint val = UInt32.MaxValue;
 
            var parts = new byte[8];
 
            uint mask = 0xf;
            int pos = 0;
 
            while (mask != 0)
            {
                parts[pos] =  (byte) ((val & mask) >> 4*pos);
                mask <<= 0x4;
                pos++;
            }
 
            foreach (var part in parts)
            {
                Console.WriteLine(part.ToString("X"));
            }
        }
1
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,487
30.09.2014, 16:12 3
Лучший ответ Сообщение было отмечено MoonGuard как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       uint num0 = 135468446;
            uint[] us = new uint[8];
//получение
            for (int i = 0; i < 32; i += 4)
            {
                us[i/4] = (num0 >> i) & 15;
                Console.WriteLine("{0:X2}", BitConverter.GetBytes(us[i/4])[0]);
            }
//склейка
            uint num1 = 0;
            for (int i = 0; i < 32; i += 4)
            {
                num1 = num1 | (us[i/4] << i);
            }
            Console.WriteLine(num1);
1
V0vchik
12 / 12 / 13
Регистрация: 06.03.2011
Сообщений: 161
30.09.2014, 16:13 4
MoonGuard, >> Операция побитового сдвига. Ней можно разделить число.
1. Нам нужен массив из 8 елементов и переменная чтобы хранить эталон. Сдвигать будем в лево пока не упремся нужными битами в стену а потом обратно на 28 позиций(32-4) и на третем круге вернем биты на свое место.

пример:
1111 1111 1111 1111 1111 1111 1111 1111
<< 24
1111 1111 0000 0000 0000 0000 0000 0000
>> 28
0000 0000 0000 0000 0000 0000 0000 1111
...0.....1......2......3......4.....5......6......7
<< (7 - i) * 4 (в цыкле i = 6 (6тая итерация)) 1*4=4
0000 0000 0000 0000 0000 0000 1111 0000
после << 4

C#
1
2
3
4
5
6
7
8
9
            uint someVar = uint.MaxValue;
            uint[] arrayVar = new uint[8];
 
            for (int i = 0; i < 8; i++)
            {
                arrayVar[i] = someVar << 28 - i * 4;
                arrayVar[i] = arrayVar[i] >> 28;
                arrayVar[i] = arrayVar[i] << (7 - i) * 4;
            }
0
nedel
594 / 592 / 347
Регистрация: 09.04.2014
Сообщений: 1,412
Завершенные тесты: 1
30.09.2014, 16:34 5
Цитата Сообщение от MoonGuard Посмотреть сообщение
Есть некоторое число uint (32-bit), его необходимо разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число, в соответствии с ним сделать замену из таблицы, склеить из этого всего обратно 32-битное число.
16-ричное число - это запись в 16 виде? Тогда
C#
1
2
3
4
uint x=7657;
string hex=x.ToString("X").PadLeft(8,'0'); // каждый символ в строке и есть ваше 16-ричное число
// сделать замену из таблицы в строке hex
x= uint.Parse(hex, System.Globalization.NumberStyles.HexNumber); // получаем обратно 32-битное число
0
30.09.2014, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2014, 16:34

5-ричное число преобразовать в двоичное число
5-ричное число, введённое пользователем программы, преобразовать в двоичное...

Если число отрицательных элементов матрицы превышает число положительных, увеличить каждый её элемент на величину среднего арифметического её элем-ов
Здравствуйте. Вот задание: Если число отрицательных элементов матрицы...

Целое число перевести в 16-ричное и 8-ричное представление с помощью объекта
написать программу которая для введенного пользователя целого числа выводит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru