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

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

30.09.2014, 15:16. Просмотров 905. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Число uint разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число (C#):

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

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

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

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

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

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

4
XRoy
860 / 710 / 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,486
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
588 / 588 / 345
Регистрация: 09.04.2014
Сообщений: 1,397
Завершенные тесты: 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
Привет! Вот еще темы с решениями:

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

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

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

Дано целое число K, а также K наборов ненулевых чисел. Каждый набор содержит не менее двух элементов, признаком его завершения является число 0. Для к
Дано целое число K, а также K наборов ненулевых чисел. Каждый набор содержит не...


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

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

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