Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
MoonGuard
12 / 12 / 0
Регистрация: 05.04.2012
Сообщений: 127
#1

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

30.09.2014, 15:16. Просмотров 795. Ответов 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#):

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

.NET 4.x Пользователь вводит число, надо разбить число по цифрам - C#
Пользователь вводит число, надо разбить число по цифрам, вывести на экран каждую цифру и потом вывести на экран число, составленное из цифр...

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

Дано целое число n. преобразовать это число так, что если ... - C#
Дано целое число n. преобразовать это число так что если подрят встречаются 2 одинаковых цифры то одна из них удаляется

Преобразовать римское число из строки в число - C#
Вводится строка. Если она является записью римского числа, то преобразовать ее в целое число (язык С#) хелп

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

4
XRoy
854 / 704 / 217
Регистрация: 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
1039 / 846 / 86
Регистрация: 31.03.2010
Сообщений: 2,465
30.09.2014, 16:12 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 / 3
Регистрация: 06.03.2011
Сообщений: 156
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
574 / 574 / 250
Регистрация: 09.04.2014
Сообщений: 1,356
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

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

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

Вывести 16-ричное число в консоль преобразовав в 10-ое число - Assembler
В переменной esi хранится 16-е число 0000001h. При выводе в консоль хочу получить соответственно 10-е число 1, а получаю &quot;рожицу&quot; (первый...

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


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

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

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