Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135

Работа с флагами: Как правильно присвоить значение?

09.04.2015, 10:51. Показов 2788. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
using System;
using System;
 
namespace IdTest
{
    class MainClass
    {
        [Flags]
        public enum ByteVal : byte
        {
            NULL = 0,
            bit1 = 0x1,
            bit2 = 0x2,
            bit3 = 0x4,
            bit4 = 0x8,
            bit5 = 0x10,
            bit6 = 0x20,
            bit7 = 0x40,
            bit8 = 0x80,
        }
        public static ByteVal ReplaceBits(ByteVal val, ByteVal bitA, ByteVal bitB)
        {
            if ((val & bitA) != 0)
            {
                if ((val & bitB) != 0)
                    val |= bitA;
                else
                    val &= ~bitA;
                val |= bitB;
            }
            else
            {
                if ((val & bitB) != 0)
                    val |= bitA;
                else
                    val &= ~bitA;
                val &= ~bitB;
            }
            return val;
        }
 
        public static int Main()
        {
            byte[] res = new byte[256];
            for (byte i = 0; i < 255; i++)
            {
                ByteVal k = (ByteVal) i;
                k = ReplaceBits(k, ByteVal.bit1, ByteVal.bit8);
            }
 
     
            Console.ReadKey();
            return 0;
        }
    }
}
Проблема вот в этой части кода:
C#
1
ByteVal k = (ByteVal) i;
мне нужен не i-отый элемент множества ByteVal, а маска i. Типа
i = 0 -> k = NULL
i = 1 -> k = ByteVal.bit1
i = 2 -> k = ByteVal.bit2
i = 3 -> k = ByteVal.bit2 | ByteVal.bit1
i = 4 -> k = ByteVal.bit3
i = 5 -> k = ByteVal.bit3 | ByteVal.bit1
i = 6 -> k = ByteVal.bit3 | ByteVal.bit2
i = 7 -> k = ByteVal.bit3 | ByteVal.bit2 | ByteVal.bit1
и т.д.

Как правильно присвоить значение?

Добавлено через 16 минут
Похоже, вот это работает:
C#
1
ByteVal k = (ByteVal) Enum.ToObject(typeof(ByteVal), i);
Все верно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2015, 10:51
Ответы с готовыми решениями:

Как правильно присвоить значение
Есть две таблицы cehi с полями id_ceh, nazv и rashod c полями id_rashod, kol, id_ceh В таблице цехи уже есть данные, нужно добавить...

Как присвоить правильно значение лэйблу ?
Здравствуйте, пишу программу на тему прогноз погоды и столкнулся с проблемой, не присваивается значение к label1.Text using System; ...

Как правильно присвоить значение NULL
Есть класс:struct TPointR3 { float r0; float r1; float r2; }; struct TPointR2 { float r0;

8
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
09.04.2015, 10:55
Я вот так биты проверяю
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
// Обрабатываем данные в 0x66
        private void Calc_0x66(byte[] data_buffer)
        {
            if_one_data_NO = true;
            I_last = data_buffer[4];
            I = data_buffer[5];
            U = data_buffer[6];
 
            // Статусы системы
            if ((data_buffer[7] & 0x01) == 0x01)
                stat_system = true;
            else
                stat_system = false;
 
            // Блокировка двигателей
            if ((data_buffer[7] & 0x02) == 0x02)
                stat_motors = true;
            else
                stat_motors = false;
 
            // Загрузка полётного задания
            if ((data_buffer[7] & 0x04) == 0x04)
                stat_load = true;
            else
                stat_load = false;
 
            // В окресности точки
            if ((data_buffer[7] & 0x08) == 0x08)
                stat_around = true;
            else
                stat_around = false;
 
            // Старт через 5 сек
            if ((data_buffer[7] & 0x10) == 0x10)
                stat_start = true;
            else
                stat_start = false;
 
            // Полётное задание отработал
            if ((data_buffer[7] & 0x20) == 0x20)
                stat_end = true;
            else
                stat_end = false;
 
            // Сгенерированна точка останова
            if ((data_buffer[7] & 0x40) == 0x40)
                stat_stop = true;
            else
                stat_stop = false;
 
            // Подана команда "ДОМОЙ"
            if ((data_buffer[7] & 0x80) == 0x80)
                stat_home = true;
            else
                stat_home = false;
        }
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
09.04.2015, 11:00  [ТС]
Ну, мне, по сути не важно где и какие флаги, мне нужно поменять местами биты... Я рационально это делаю, по крайне мере для C#?
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
using System;
 
namespace IdTest
{
    class MainClass
    {
        [Flags]
        public enum ByteVal : byte
        {
            NoBits = 0,
            Bit1 = 0x1,
            Bit2 = 0x2,
            Bit3 = 0x4,
            Bit4 = 0x8,
            Bit5 = 0x10,
            Bit6 = 0x20,
            Bit7 = 0x40,
            Bit8 = 0x80,
            AllBits = 0xFF
        }
        public static ByteVal ReplaceBits(ByteVal val, ByteVal bitA, ByteVal bitB)
        {
            if ((val & bitA) != 0)
            {
                if ((val & bitB) != 0)
                    val |= bitA;
                else
                    val &= ~bitA;
                val |= bitB;
            }
            else
            {
                if ((val & bitB) != 0)
                    val |= bitA;
                else
                    val &= ~bitA;
                val &= ~bitB;
            }
            return val;
        }
 
        public static int Main()
        {
            byte[] res = new byte[256];
            for (byte i = 0; i < 255; i++)
            {
                ByteVal k = (ByteVal) Enum.ToObject(typeof(ByteVal), i);
                k = ReplaceBits(k, ByteVal.Bit1, ByteVal.Bit6);
                k = ReplaceBits(k, ByteVal.Bit2, ByteVal.Bit5);
                k = ReplaceBits(k, ByteVal.Bit3, ByteVal.Bit8);
                k = ReplaceBits(k, ByteVal.Bit4, ByteVal.Bit7);
                res[i] = (byte)k;
            }
 
     
            Console.ReadKey();
            return 0;
        }
    }
}
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
09.04.2015, 11:09
C#
1
2
3
4
5
6
7
8
9
10
//модуль смены значений заданных битов
        static byte ChangeTwoBitsInByte(int N1, int N2, byte b)// N1 и N2 - номера(с нуля и справа) битов для изменения, b - байт для изменения
        {
            if ((N1>8) || (N2>8)) {return 0x00;}
            byte m = 0x01;
            byte m1 = (byte)(m << N1);//маска для первого участвующего бита
            byte m2 = (byte)(m << N2);//маска для второго участвующего бита
            b = (byte)(b ^ m1 ^ m2);
            return b;
        }
1
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
09.04.2015, 12:27  [ТС]
Да, работает в три раза быстрее, спасибо. Но я думаю производительность не критична, если эта функция будет вызывается крайне редко (в худшем случае раз в 10 минут).

Добавлено через 1 минуту
Хотя, мне этот код больше нравится, лучше буду использовать его

Добавлено через 17 минут
А почему бы не просто:
C++
1
2
 byte m1 = (byte)(1 << N1);//маска для первого участвующего бита
            byte m2 = (byte)(1 << N2);//маска для второго участвующего бита
вместо
C++
1
2
3
byte m = 0x01;
            byte m1 = (byte)(m << N1);//маска для первого участвующего бита
            byte m2 = (byte)(m << N2);//маска для второго участвующего бита
?
0
 Аватар для Sanya_sa
912 / 816 / 333
Регистрация: 03.02.2015
Сообщений: 5,276
Записей в блоге: 9
09.04.2015, 12:31
для нагляжности да и привычнее мне выносить один из параметров(малали как надумаем его использовать)
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
09.04.2015, 12:46  [ТС]
Хм, я все верно делаю?
C#
1
2
3
4
5
6
byte b = (byte) i;
                b = ChangeTwoBitsInByte(0, 5, b);
                b = ChangeTwoBitsInByte(1, 4, b);
                b = ChangeTwoBitsInByte(2, 7, b);
                b = ChangeTwoBitsInByte(3, 6, b);
                res[i] = b;
Просто результат работы вот такой:


А моего кода вот такой:
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.04.2015, 12:52
PVD, а что должен делать метод ReplaceBits?
Присваивать битам параметра val, определенным маской bitA, значения битов val, определенных маской bitB?
0
24 / 24 / 11
Регистрация: 01.06.2014
Сообщений: 135
09.04.2015, 12:54  [ТС]
Оно должно поменять два бита местами, я неправильно назвал метод, там следовало бы указать SwapBits
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2015, 12:54
Помогаю со студенческими работами здесь

Поскажите как правильно присвоить значение из Memo в массив
int i,j,n,x; float A={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10}; float B; for (j=0;j&lt;=9;j++) B=0; Memo2-&gt;Lines-&gt;LoadFromFile(&quot;a.txt&quot;); ...

Как правильно выполнить команду SELECT и присвоить значение переменным
Всем самые наилучшие пожелания в Новом Году! Подскажите пожалуйста в чем грабли: 'Выбираю значение из табл. Принтер ...

Работа с флагами
Работа с флагами запомните их первоначальное состояние, измените и восстановите состояние флагов. Задание: 1. Перегрузите операцию...

PIC. Работа с флагами (ASM)
Доброго времени суток уважаемые форумчане. Может кто может привести пример работы с флагами(C и Z) в АСМ под PIC, если быть точнее то...

Присвоить 8-му элементу массива значение 10-го элемента, увеличенное на 5, а 10-му присвоить значение 13-го
Одномерный массив из 15 элементов заполнить случайным образом числами от 7 до 12. Присвоить 8-му элементу значение 10-го элемента,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru