Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
12 / 12 / 1
Регистрация: 05.04.2012
Сообщений: 127
1
.NET 4.x

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

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

Author24 — интернет-сервис помощи студентам
Не могу решить следующую задачу:
Есть некоторое число uint (32-bit), его необходимо разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число, в соответствии с ним сделать замену из таблицы, склеить из этого всего обратно 32-битное число.
Я пока не представляю, как можно разбить uint на 8 частей по 4 бита, если подскажите, то буду благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2014, 15:16
Ответы с готовыми решениями:

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

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

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

Как разбить 64 битное число на 2 числа по 32 бита?
Здравствуйте, как разбить 64 битное число на 2 числа по 32 бита? Добавлено через 7 минут Я...

4
870 / 720 / 304
Регистрация: 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
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
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
12 / 12 / 13
Регистрация: 06.03.2011
Сообщений: 166
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
1145 / 873 / 507
Регистрация: 09.04.2014
Сообщений: 2,056
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2014, 16:34
Помогаю со студенческими работами здесь

Вывести 16-ричное число в консоль преобразовав в 10-ое число
В переменной esi хранится 16-е число 0000001h. При выводе в консоль хочу получить соответственно...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru