Как проверить все биты в байте?

Нужно проверить все биты в байте. Единственное, что приходит в голову - это проверять каждый бит по отдельности:
/*Грубо вырезанный кусок кода*/
...
byte err;
...
                if ((err & 0x01) != 0) AddMessage("1", "А1");
                if ((err & 0x02) != 0) AddMessage("1", "А2");
                if ((err & 0x04) != 0) AddMessage("2", "Б1");
                if ((err & 0x08) != 0) AddMessage("2", "Б2");

                if ((err & 0x10) != 0) AddMessage("1", "АА1");
                if ((err & 0x20) != 0) AddMessage("1", "АА2");
                if ((err & 0x40) != 0) AddMessage("2", "ББ1");
                if ((err & 0x80) != 0) AddMessage("2", "ББ2");
...

Думаю это не самое оптимальное решение. Возможно потребуется таким образом проверять 2 байта...
Подскажите, пожалуйста, чем и как можно заменить конструкции if?
  • Вопрос задан
  • 1774 просмотра
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
Такие конструкции if надо заменять на словарь.

Если у вас индексы последовательные и начинаются с нуля, то роль словаря может сыграть список или массив.
В любом случае, вам нужно сделать отображение "номер бита" => "сообщение".

Номер бита предлагаю сохранять, чтобы было удобнее записывать таблицу и идти по ней циклом. Оператор сдвига даст вам нужную константу для операции "И".
Итого:
using System;
using System.Collections.Generic;

public class Test
{
	private static void AddMessage(Tuple<string, string> message)
	{
		Console.WriteLine("{0}, {1}", message.Item1, message.Item2);
	}
	
	public static void Main()
	{
		byte val = 176;
		
		for (int i = 0; i <= 7; i++)
		{
			if ((val & (1 << i)) != 0)
				AddMessage(messageByBitIndex[i]);
		}
	}
	
	private static Tuple<string, string>[] messageByBitIndex =
	{
		Tuple.Create("1", "А1"),  // 0
		Tuple.Create("1", "А2"),  // 1
		Tuple.Create("2", "Б1"),  // 2
		Tuple.Create("2", "Б2"),  // 3
		Tuple.Create("1", "АА1"), // 4
		Tuple.Create("1", "АА2"), // 5
		Tuple.Create("2", "ББ1"), // 6
		Tuple.Create("2", "ББ2"), // 7
	};
}


ideone.com/vbLapl
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev
software engineer
В С# не силен, потому синтаксис неверен, но идея такая:

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
for (int bit = 1; bit <= 8; bit++)
{
if (CHECK_BIT(err, bit))
{
string = string + mystringarray[bit];
}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы