Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/47: Рейтинг темы: голосов - 47, средняя оценка - 4.64
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3

Определение изменения бит в байте

27.08.2021, 19:18. Показов 11293. Ответов 128

Студворк — интернет-сервис помощи студентам
Всем ку!
Возник вопрос по оптимальному методу определения изменившихся бит в байте.
Два байта прилетают по сети и имеют следующий вид:

Суть в следующем (на примере байта Е8):
0-й, 3-й и 6-й биты "работы", говорят о включенном или выключенном состоянии участка. 1-й, 2-й, 4-й, 5-й, ... биты - определения сторон (L/R) соотв. участков. Они всегда находятся в одном из двух состояний: 01 либо 10. Состояний 00 или 11 не бывает.
Так вот, в идеале, требуется определить момент смены состояний, допустим с 01 на 10, при установленном бите "работы".
Если бит "работы" не установлен, то изменения состояний бит сторон пофигу.
Пока я делаю это так (без учета бита "работы"):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            if ( _byte != _oldByte )
            {
                int _change = _byte ^ _oldByte;
 
                for ( int i = 7; i > -1; i-- )
                {
                    if ( ( _change >> i & 1 ) == 1 ) 
                    { 
                        lstSndIndex.Add( i ); //здесь запись в лист индекса изменившихся бит для последующей отправки в сеть
                    }
                }
 
                _oldByte = _byte;   
            }
т.е. я сравниваю текущее состояние с некоторым прошлым значением.
Можно ли как-то сделать иначе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.08.2021, 19:18
Ответы с готовыми решениями:

Поменять порядок бит в байте
Есть некий байт, необходимо порядок его первых 3х бит поменять на обратный! Подскажите Добавлено через 6 минут По сути надо 0 и 2...

Обмен двух бит в байте местами
Например, требуется обменять местами 2-й и 3-й бит в байте, если один из них == 1. Можно сделать это так: int _byte = 9; //...

В байте не восемь бит.
Мне знакомый показал статейку следующего вида: Внимание! Путаница в терминологии. Читать всем! zaff » 14 авг 2009, 18:09 ...

128
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 16:43  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от escoult Посмотреть сообщение
Какая разница, каким образом вы формируете неверное значение байта?
Если не затруднит, приведите ситуацию, когда описываемый вами эффект может проявится. Я что-то не соображу...

Добавлено через 23 минуты
Да, есть недоработка. Последний оставшийся в работе участок при выключении не сбрасывает свои выхода на втором контроллере.

Добавлено через 10 минут
Загвоздка тут или выше:
C#
1
2
// Новое состояние изменившихся отслеживаемых бит
int newBits = received & changedListen;
newBits == 0, а не должно.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 19:38
Цитата Сообщение от wizard41 Посмотреть сообщение
Пока не пойму что не так.
Так всё Ок?

Цитата Сообщение от escoult Посмотреть сообщение
Маска не видит, что бит изменился (это логично, он не менялся)
Я старался учесть эту ситауцию.
Конечно, делал без отладки и мог что-то упустить.

Но обратите внимание на код и комменты в нём.
Там не одна маска делается, а две.
Именно для учёта описанной вам ситуации.

Добавлено через 16 минут
Цитата Сообщение от wizard41 Посмотреть сообщение
Да, есть недоработка. Последний оставшийся в работе участок при выключении не сбрасывает свои выхода на втором контроллере.
У меня же нет отладки.
Я дал код метода.
Может написать какую серию данных надо прогнать через него чтобы получить неверный результат.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 20:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так всё Ок?
Да, пока не остается в работе одна линия. Когда она выключается, то в ответ от сервера мы получаем 0b_001_001_001_001_001, что соответствует int activeMask = 0b_001_001_001_001_001;. После этого все действия с newBits прекращаются.
Это происходит потому, что мы не знаем текущего состояния бит на другой стороне. Следовательно, лучше все же их получать.
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
30.08.2021, 20:10
Цитата Сообщение от wizard41 Посмотреть сообщение
Если не затруднит, приведите ситуацию, когда описываемый вами эффект может проявится. Я что-то не соображу...
Наиболее типичная на мой взгляд может быть такой.
Участок работал с активной линией L. Хотя это не важно, но для примера пусть будет L.
Затем участок был отключен. После отключения, на нем начинаются ремонтные работы и состояние линий изменяется на R. Поскольку участок неактивен, эти изменения не отправляются на конечный контроллер, на нем все еще находится состояние активной линии L.

Далее приходит байт опять с активной линией R, но на этот раз с битом работы участка. Теперь участок необходимо включить и активировать линию R. Однако, маска не фиксирует изменение линий на этом участке, и метод не отправляет бит R. В результате участок будет активирован с последним состоянием этого бита на контроллере, а он был L.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 20:30  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Наиболее типичная на мой взгляд может быть такой.
Этот момент я не проверил, да. Уже вырубил симуляцию, но вы меня заинтриговали. Сейчас прокрутим...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 20:45
Цитата Сообщение от wizard41 Посмотреть сообщение
Когда она выключается, то в ответ от сервера мы получаем 0b_001_001_001_001_001
Вы ранее писали что такая ситуация невозможна, поэтому я не обрабатывал её.
Какие действия нужны в этом случае?

Допустим, можно в самом начале просто сравнить received с activeMask.
И если они равны - выйти из метода.

Добавлено через 2 минуты
Если ситуацию отсутствия инверсии на информационных битах нужно проверять по отдельности на каждой линии, то это тоже можно реализовать.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 20:46  [ТС]
Так, начинаем сначала. Исходная ситуация:

Все участки выключены, стороны случайны.
Соединяемся...

Инициируем прием/передачу (жмем Ентер):

В целевом контролере ничего не включилось - как и положено:

Далее... (минуточку)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 20:48
Цитата Сообщение от escoult Посмотреть сообщение
Далее приходит байт опять с активной линией R, но на этот раз с битом работы участка. Теперь участок необходимо включить и активировать линию R. Однако, маска не фиксирует изменение линий на этом участке, и метод не отправляет бит R.
Эту ситуацию я пытался предусмотреть.
Не поручусь за корректность, конечно.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 20:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы ранее писали что такая ситуация невозможна, поэтому я не обрабатывал её.
Подождите, я тоже немного путаюсь уже . Нет, там не так. Не такой ответ.

Добавлено через 1 минуту
Далее, имитируем случай, предложенный escoult...
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 21:06  [ТС]
Сначала, включим 1-ю и, допустим, 5-ю линии:

В сеть мы пока еще ничего не передавали и не получали, поэтому целевой К спокойно спит:

Считаем и запишем изменения:

Пока все верно, включились 1L и 5L:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 21:13  [ТС]
Цитата Сообщение от escoult Посмотреть сообщение
Участок работал с активной линией L.
Затем участок был отключен. После отключения, на нем начинаются ремонтные работы и состояние линий изменяется на R.
Отключаем участок (активная линия L):

Сеанс связи:

Выход 1L сброшен:
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 21:27  [ТС]
На отключенном участке изменили стороны:
Название: change1.png
Просмотров: 49

Размер: 5.6 Кб
Затем участок включился:

А теперь тот самый момент: сеанс приема/передачи...

Иии.... Включился выход 1R, как и ожидалось:

Предположение:
В результате участок будет активирован с последним состоянием этого бита на контроллере, а он был L.
Не подтвердилось
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 21:47
Цитата Сообщение от wizard41 Посмотреть сообщение
Не подтвердилось
Так всё Ок или нет?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 21:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так всё Ок или нет?
Остается пока вопрос с последним включенным участком - если его выключить, то не происходит сброс выходов его сторон.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 21:56
Цитата Сообщение от wizard41 Посмотреть сообщение
Остается пока вопрос с последним включенным участком - если его выключить, то не происходит сброс выходов его сторон.
Почему не подходит:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
можно в самом начале просто сравнить received с activeMask.
И если они равны - выйти из метода.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 22:04  [ТС]
Вообще, опыт с симуляцией оборудования показал, что мы вполне корректно получаем и передаем данные. Поэтому считаю, что нужно вернуться в плоскость чистого NET C#, и отработать модель формирования нужных байт в нем, без применения сторонних приложений.
Элд Хасп, escoult, я понимаю, что возможны некоторые недопонимания всего процесса в глобальном смысле. От сюда возможные ошибки в предположениях.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почему не подходит:
Байт передачи, в месте где находится бит последней включенной стороны содержит "1", а должен бы сбросится. В вашем примере это не произойдет, т.к. от контроллера мы не получили биты активных сторон (они все стали выключенными).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
30.08.2021, 22:12
Цитата Сообщение от wizard41 Посмотреть сообщение
Байт передачи, в месте где находится бит последней включенной стороны содержит "1", а должен бы сбросится. В вашем примере это не произойдет, т.к. от контроллера мы не получили биты активных сторон (они все стали выключенными).
Вообще то, я реализовал так, что в случае 001_001_001_001_001 на выходной стороне должны быть все нули.
Возможно, что-то не учёл.
Сейчас уже времени нет - проверю завтра.

Добавлено через 1 минуту
wizard41, составьте мне серии последовательностей приводящих к неправильному выводу и укажите какой должен быть правильный вывод.
Чтобы я завтра "не гадал в потёмках".
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
30.08.2021, 22:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вообще то, я реализовал так, что в случае 001_001_001_001_001 на выходной стороне должны быть все нули.
Элд Хасп, Ок, давайте завтра посмотрим что к чему.
0
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
31.08.2021, 09:34
Цитата Сообщение от wizard41 Посмотреть сообщение
Не подтвердилось
Что то здесь не то с вашей симуляцией. В коде одно написано, а симулируете вы что то другое, либо делаете это неправильно.
ОК, биты сбрасываются, я не знал точно как у вас происходит отключение. То есть, отправили 00 - сторона отключилась. Но тогда все хуже становится. Если на каком то участке биты не изменились, то он отключится, хотя должен продолжать работать.

И вот этого момента, я не вижу в вашей симуляции. Сначала вы включаете две линии 1-ю и 5-ю, потом отключаете 1-ю, а 5-я продолжает работать. Однако код (ну если вы используете тот код, что выложен в вашем посте), не сможет этого сделать, обе линии продолжат работу. Вот, я взял данные с ваших скринов отправки получения:

Code
1
2
0b_011_100_010_100_011 //включаем 1-ю и 5-ю
0b_011_100_010_100_010 //отключаем 1
Что вернет код? Он вернет 0. И даже ничего не отправит.
Но у вас 1-я линия сбрасывается и работает только 5-я. Каким образом?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
31.08.2021, 10:30
Цитата Сообщение от escoult Посмотреть сообщение
Что вернет код? Он вернет 0.
Нет!

Цитата Сообщение от escoult Посмотреть сообщение
В коде одно написано, а симулируете вы что то другое, либо делаете это неправильно.
Вот код для тестирования:
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
63
64
65
66
67
68
69
70
71
        // Последнее переданное состояние
        private static int oldReceived = 0b_001_001_001_001_001;
        // Буферный массив для передачи
        private static readonly byte[] bytes = new byte[2];
        //Маска активных узлов
        private const int activeMask = 0b_001_001_001_001_001;
 
        public static void BridgePorts(int received)
        {
            bool isSend = false;
            lock (bytes)
            {
                // Принятые биты
                //int received = 0b_001_001_001_001_001;
 
                //Получаем активные узлы
                int active = received & activeMask;
 
                // Маска отслеживаемых бит.
                int listen = active << 1 | active << 2;
 
                // Маска изменившихся бит
                int changed = received ^ oldReceived;
 
                // Маска изменившихся отслеживаемых бит
                int changedListen = changed & listen;
 
                // Новое состояние изменившихся отслеживаемых бит
                int newBits = received & changedListen;
 
                if (newBits != 0)
                {
                    // Запоминание состояния отслеживаемых бит
                    oldReceived &= ~changedListen; // Сброс ранее сохранённого состояния бит.
                    oldReceived |= newBits; // Запись на их место новых состояний.
 
                    // Переформатирование бит
                    int input = oldReceived;
                    int zip = 0;
                    int mask = 0b_11;
                    for (int i = 0; i < 5; i++)
                    {
                        input >>= 1;
                        zip |= (input & mask);
                        mask <<= 2;
                    }
 
 
 
                    bytes[0] = (byte)(zip & 255);
                    bytes[1] = (byte)((zip >> 8) & 255);
 
                    //SendBit(....., bytes);
                    isSend = true;
                }
            }
            ConsoleWrite(received, bytes, isSend);
        }
 
        private static void ConsoleWrite(int num, byte[] bytes, bool isSend)
        {
            string bits = Convert.ToString(num, 2);
            bits = bits.PadLeft(15, '0');
            bits = $"{bits.Substring(0, 3)}_{bits.Substring(3, 3)}_{bits.Substring(6, 3)}_{bits.Substring(9, 3)}_{bits.Substring(12, 3)}\t";
            Console.Write(bits);
            bits = Convert.ToString(bytes[0] | bytes[1] << 8, 2);
            bits = bits.PadLeft(10, '0');
            bits = $"{bits.Substring(0, 2)}_{bits.Substring(2, 2)}_{bits.Substring(4, 2)}_{bits.Substring(6, 2)}_{bits.Substring(8, 2)}\t";
            Console.Write(bits);
            Console.WriteLine(isSend ? "Отправлено": "");
        }
Вот сам тест:
C#
1
2
3
4
        static void Main(string[] args)
        {
            BridgePorts(0b_011_100_010_100_011); //включаем 1-ю и 5-ю
            BridgePorts(0b_011_100_010_100_010); //отключаем 1-ю
Вот Консоль:
Code
1
2
011_100_010_100_011     01_00_00_00_01  Отправлено
011_100_010_100_010     01_00_00_00_01
Добавлено через 3 минуты
Цитата Сообщение от escoult Посмотреть сообщение
И даже ничего не отправит.
Да.
Он и не должен отправлять, поскольку состояние выходных битов не изменяется.

Добавлено через 8 минут
Вот другой тест:
C#
1
2
3
4
5
            BridgePorts(0b_011_100_010_100_011); //включаем 1-ю и 5-ю
            BridgePorts(0b_011_100_010_100_010); //отключаем 1-ю
 
            BridgePorts(0b_011_100_010_100_100); //изменяется отключённая линия
            BridgePorts(0b_011_100_010_100_101); //включаем 1-ю с изменением
Консоль:
Code
1
2
3
4
011_100_010_100_011     01_00_00_00_01  Отправлено
011_100_010_100_010     01_00_00_00_01
011_100_010_100_100     01_00_00_00_01
011_100_010_100_101     01_00_00_00_10  Отправлено
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2021, 10:30

Изменить рандомный бит в байте
Доброго времени суток. Подскажите пожалуйста, как сменить рендомный бит в считанном из файла байте? На другом языке обычно строка - это...

Порядок байт в слове и бит в байте
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

Написать функцию, меняющую порядок бит в байте
написать функцию, меняющую порядок бит в байте. заранее спасибо

последовательность инструкций для обнуления трех старших бит регистра DH, без изменения остальных бит
Напишите последовательность инструкций для обнуления трех старших бит регистра DH, без изменения остальных бит; результат сохраните в...

Есть ли функция которая может определить сколько бит в байте?
Нужно получить количество бит из байта, может есть готовые функции возвращающие результат?


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru