Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 49

Число разложить на битовый массив

22.03.2015, 23:48. Показов 8656. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Граждане, прошу прощения за позорище, но никогда ранее не трогал побитовые операции.
Вопрос таков:
Мне приходит от устройства число типа byte в котором битами зашиты, так сказать, маркеры, которые надо опознать.
Так биты с 0 по 4 отвечают за уровень аттеннюации сигнала, бит № 7 отвечает за включение\выключение канала в устройстве.

мне надо, видимо число разложить на битовый массив, что ли, и сравнивать нули и единицы. или каким-то образом вычленить отдельные биты... хз)

Направьте в нужную сторону.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2015, 23:48
Ответы с готовыми решениями:

Отсортировать большое число элементов за минимальное время, используя битовый массив
Всем привет! Вот, получил задание такое: написать сортировку большого числа элементов за минимальное время, используя битовый массив....

Динамический массив: целое число разложить на массив простых множителей
Доброго времени суток всем. Целое число необходимо разложить на массив простых множителей. Столкнулся с проблемой, мне нужно, чтобы...

Разложить число на простые множители через массив
разложить сложное число на простые множители, через массив.

17
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2015, 00:12
Проще всего использовать BitArray
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.03.2015, 10:25
Цитата Сообщение от PresnovEA Посмотреть сообщение
Мне приходит от устройства число типа byte
C#
1
byte data = ReadByteFromDevice();
Цитата Сообщение от PresnovEA Посмотреть сообщение
биты с 0 по 4 отвечают за уровень аттеннюации сигнала
C#
1
int level = data & 0x0F;
Цитата Сообщение от PresnovEA Посмотреть сообщение
бит № 7 отвечает за включение\выключение канала в устройстве
C#
1
bool isOn = (data & 0x80) > 0;
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 49
23.03.2015, 10:39  [ТС]
ViterAlex, а как распарсить число типа byte в такой массив?

Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Сообщение от PresnovEA
Мне приходит от устройства число типа byte
Код C#
1
byte data = ReadByteFromDevice();
тк не получится, ибо приходит байтовый массив, один байт которого надо парсить.

а так, получается, что все подобные операции надо втупую ручками делать?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.03.2015, 10:46
PresnovEA, можно преобразовать в строковое представление в двоичной системе и уже по значениям в определенной позиции принимать решение.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            byte element = 0xAD;
            Console.WriteLine(Convert.ToString(element, 2));
        }
    }
}
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
23.03.2015, 11:07
можно через флаги, можно ручками бинарными операциями if(( received_byte &0x40) == 0x40) { канал включен } else { канал выключен }. Уровень сигнала можно попробовать проверить так var level = received_byte & 0xF;
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.03.2015, 11:27
Цитата Сообщение от PresnovEA Посмотреть сообщение
тк не получится
Это пример, чтобы не было вопросов типа "что такое data?".

Никто не запрещает дергать байты из массива.
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 49
23.03.2015, 11:47  [ТС]
Всем спасибо!

arrjj, для работы с флагами нужны перечисления, а как перегнать байт побитово в перечисление?
Через строку?

Добавлено через 1 минуту
Цитата Сообщение от kolorotur Посмотреть сообщение
Никто не запрещает дергать байты из массива.
у меня, к сожалению не массив, а число.

есть какой-нибудь красивый выход из ситуации?))
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.03.2015, 12:06
Цитата Сообщение от PresnovEA Посмотреть сообщение
приходит байтовый массив
Цитата Сообщение от PresnovEA Посмотреть сообщение
у меня, к сожалению не массив, а число.
Так что же из этого верно?
0
Заблокирован
23.03.2015, 12:11
может пригодится, делал для лабы недавно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Bitset
{
    public UInt64 value;
 
    public bool this[int index]
    {
        get
        {
            return Convert.ToBoolean(this.value & (UInt64)(1 << index));
        }
        set
        {
            if (value)
                this.value |= (UInt64)1 << index;
            else
                this.value &= (UInt64)~(1 << index);
        }
    }
 
    public bool[] ToArray()
    {
        var array = new bool[64];
        for (int i = 0; i < 64; i++)
            array[i] = this[i];
        return array;
    }
 
    public byte GetByte(int index)
    {
        if (index < 0 || index > 7)
            throw new IndexOutOfRangeException("Index out of range !");
        int offset = index * 8;
        UInt64 mask = (UInt64)0xff << offset;
        return (Byte)((value & mask) >> offset);
    }
 
    public byte SetByte(int index, byte value)
    {
        if (index < 0 || index > 7)
            throw new IndexOutOfRangeException("Index out of range !");
        int offset = index * 8;
        UInt64 mask = (UInt64)value << offset;
        this.value &= mask;
        this.value >>= offset;
        return (Byte)this.value;
    }
 
    public static UInt64 Combine(UInt32 value1, UInt32 value2)
    {
        return (UInt64)(value1 << 32 | value2);
    }
 
    public static UInt32 Combine(UInt16 value1, UInt16 value2)
    {
        return (UInt32)(value1 << 16 | value2);
    }
 
    public static UInt16 Combine(Byte value1, Byte value2)
    {
        return (UInt16)(value1 << 8 | value2);
    }
}
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 49
23.03.2015, 12:25  [ТС]
insite2012, пардон, не сосем точно указал начальные условия. Вот выдержка одного из моих каментов: тк не получится, ибо приходит байтовый массив, один байт которого надо парсить.
То есть формально один байт
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
23.03.2015, 12:28
Цитата Сообщение от PresnovEA Посмотреть сообщение
То есть формально один байт
Ну так берите его из массива (по индексу) и работайте с ним по одному из предложенных выше способов.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
23.03.2015, 12:38
Цитата Сообщение от PresnovEA Посмотреть сообщение
а как перегнать байт побитово в перечисление?
var _flags = (Твой_enum)byte; вроде так.
0
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
23.03.2015, 12:44
Честно говоря, особо не вчитывался в ваш вопрос, но пролистав ответы...

Наглядней и спокойней с байтами в .Net работать через перечислимый тип:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[Flags]
enum EnumByte:byte
{
    None = 0,
    Set0 = 1,
    Set1 = 2,
    Set2 = 4,
    Set3 = 8,
    Set4= 16,
    Set5= 32,
    Set6= 64,
    CanalDeviceOn = 128
}
проверять установлен ли бит примерно так:

C#
1
2
3
4
5
byte[] data = new byte[]{0x80};
 
var currByte = (EnumByte)data[0];
 
bool isDeviceCanalOn = (currByte & EnumByte.CanalDeviceOn ) == EnumByte.CanalDeviceOn;
п.с.: вышеизложенные варианты работоспособны, но, как показывает практика, сложны в поддержании кода)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.03.2015, 13:07
Цитата Сообщение от FesS92 Посмотреть сообщение
C#
1
(currByte & EnumByte.CanalDeviceOn ) == EnumByte.CanalDeviceOn
Начиная с четвертого фреймворка у перечислений есть метод HasFlag, который позволяет делать то же самое более короткой записью:
C#
1
bool isDeviceCanalOn = currByte.HasFlag(EnumByte.CanalDeviceOn);
1
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
23.03.2015, 13:11
Вы совершенно правы) Вылетело из головы)
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
23.03.2015, 14:55
Цитата Сообщение от PresnovEA Посмотреть сообщение
как распарсить число типа byte в такой массив?
C#
1
BitArray ba = new BitArray(new byte[]{твой байт});
0
0 / 0 / 0
Регистрация: 17.02.2015
Сообщений: 49
26.03.2015, 14:50  [ТС]
всем спасибо! Все получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2015, 14:50
Помогаю со студенческими работами здесь

Разложить число в массив так, чтобы элементами была последовательность с единицы о этого числа
как разложить число и записать в массив....например дано 4 4= 4 3 2 1 в масив записать 4 3 2 1

Запись в битовый массив
Имеется битовый массив размерностью 200 бит (25 байтов), есть случайная последовательность цифр (0 - 199). Как установить бит,...

собственный битовый массив
Народ! У меня задание на курсач реализовать свой класс битовых массивов. Подскажите, что можно нормального в него еще впихнуть(я уже...

NetworkOnMainThreadException при сохранении картинки в битовый массив
Беру данные с веб сайта как JSON и созраняю в базу данных sqlite. Собираюсь созранять картинку как byte, но при методе, который из URL на...

Алгоритм решето Эратосфена реализация через битовый массив
Найти все простые числа не превосходящие 1000. Использовать алгоритм решето Эратосфена и битовый массив. в универе дали программу, но она...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru