Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Извлечение из целого числа определенное количество битов

28.11.2019, 09:06. Показов 3293. Ответов 6
Метки bit (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра. Необходимо написать универсальный метод, который позволит из целого без знакового (Uint32) извлечь определенный фрейм битов и преобразовать выделенный фрейм снова в целое число (Int32), в разных комбинациях?

Пример (жирным выделены фреймы, которые необходимо получить):
Число = 4194967295;

1111 10100000101000011110 11111111

1111 10100000101000011110 11111111
Далее
111 1 10100000101000011110 11111111 - тут все просто value & (1 << (bitNumber));
Потом
1111 101000001010000111 10 11111111

- Метод называется GetBitFrame
- Возвращает целочисленное (int)
- Первый параметр - исходное число целое без знаковое(uint)
- Второй параметр - размер кадра (количетво бит, которые необходимо выделить из целого числа)
- Ну и параметры, например для сдвигов влево-вправо (short, int не важно).

Я сделал так, но это работает не правильно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private const uint Value = 4194967295;
 
private uint GetBitFrame(short leftShift, short rightShift)
        {
            if (leftShift < 0 || leftShift > 31 || rightShift < 0 || rightShift > 31)
            {
                throw new ArgumentOutOfRangeException();
            }
 
            var buffer = (Value << 1) >> leftShift; // откинул справа на leftShift
            var result = buffer << rightShift; // откинул влево на rightShift
 
            return result;
        }
 
public int TwentyBitFrame => Convert.ToInt32(GetBitFrame(9, 4)); // Тут должен получить 10100000101000011110 DEC = 657950
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2019, 09:06
Ответы с готовыми решениями:

Посчитать количество единичных битов числа
1. Дано натуральное число меньше 256. Посчитать количество его единичных битов. Например, если дано число 9, запись которого в двоичной...

Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе
Здравствуйте, уважаемые мастера программирования. Нуждаюсь в вашей помощи. Написать функцию, которая для заданного целого числа Х...

Написать функцию, которая для заданого целого числа Х вычисляет количество пар (расположенных друг за другом) нулевых битов в этом числе
Помогите плиз)) Нужно срочно на завтра написать прогу на С++. Если можно с блок-схемой. Заранее спасибо.

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.11.2019, 11:55
Лучший ответ Сообщение было отмечено Jman как решение

Решение

Цитата Сообщение от Jman Посмотреть сообщение
- Метод называется GetBitFrame
- Возвращает целочисленное (int)
- Первый параметр - исходное число целое без знаковое(uint)
- Второй параметр - размер кадра (количетво бит, которые необходимо выделить из целого числа)
- Ну и параметры, например для сдвигов влево-вправо (short, int не важно).
C#
1
2
3
4
5
6
int GetBitFrame(uint value, int length, int shift)
{
    uint mask = ((1U << length) - 1) << shift;
    uint frame = value & mask;
    return (int)frame;
}
Возвращает length битов значения value, начиная с shift битов от младшего.
На вашем примере:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
uint value = 0b_11111010_00001010_00011110_11111111;
 
 // 20 битов, начиная после 8-го справа
var a = GetBitFrame(value, 20, 8); // 0000_10100000101000011110_00000000
 
// 8 битов, начиная с младшего
var b = GetBitFrame(value, 8, 0); // 000000000000000000000000_11111111
 
// 1 бит, начиная после 28-го
var b = GetBitFrame(value, 1, 28); // 000_1_0000000000000000000000000000
 
// 2 бита, начиная после 8-го
var b = GetBitFrame(value, 2, 8); // 0000000000000000000000_10_00000000
Если полученный "фрейм" нужен начинающимся с начала, то после взятия маски просто сдвиньте frame вправо на shift:
C#
1
return (int)(frame >> shift);
2
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2019, 12:44  [ТС]
Замечательный ответ! Спасибо!
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.11.2019, 13:16
Jman, если вам нужна выхваченная часть, но сдвинутая в начало, то вместо сдвига результата вправо в конце, лучше сдвинуть его в начале — одним сдвигом будет меньше:
C#
1
2
3
4
5
6
int GetBitFrame(uint value, int length, int shift)
{
    uint mask = (1U << length) - 1;
    uint frame = value >> shift & mask;
    return (int)frame;
}
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2019, 13:18  [ТС]
Мне по факту нужно число - закодированное в битовом фрейме, мне не нужно двигать в начало по идее.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.11.2019, 13:23
Цитата Сообщение от Jman Посмотреть сообщение
Мне по факту нужно число - закодированное в битовом фрейме
Ну тогда изначальный вариант, просто постановка задачи могла быть интерпретирована по-разному:
Цитата Сообщение от Jman Посмотреть сообщение
преобразовать выделенный фрейм снова в целое число (Int32)
Добавлено через 2 минуты
Хотя, если число закодировано во фрейме, то может все-таки нужно?
Если где-то в середине значения закодировано число 3 (0b11), то вы хотите получить 3 (0b11) или 3221225472 (0b11000000000000000000000000000000‬)‬, если оно закодировано в старших двух байтах?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
28.11.2019, 13:24  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
то может все-таки нужно?
Взял на вооружения обе методики. На практике посмотрю, как оно будет себя вести. Благодарю вас за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2019, 13:24
Помогаю со студенческими работами здесь

Извлечение целого квадратного корня из целого числа
Напишите полную программу для извлечения целого квадратного корня из целого числа. Проверьте, как она будет работать, если на вход функции...

Инверсия двух средних битов длинного целого числа
Стоит задача в лабке по инверсии двух средних битов длинного целого числа. По инверсию вкурсе, только вот как инвертировать именно два...

Реализовать алгоритм зеркального отображения тетрад битов значения целого числа без знака
Реализовать алгоритм зеркального отображения тетрадь битов значения целого числа без знака. Значение переменной, подлежащей преобразованию,...

Реализовать алгоритм зеркального отображения тетрад битов значения целого числа без знака
Реализовать алгоритм зеркального отображения тетрад битов значения целого числа без знака. Значение переменной, подлежащей преобразованию,...

Описать функцию целого типа, находящую количество цифр целого положительного числа K
Описать функцию DigitCount(K) целого типа, находящую количество цифр целого положительного числа K. Используя Описать функцию DigitCount(K)...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru