Преобразовать набор из 32 логических значений в 32-битное целое

Итак, я новичок в С#, и я искал, но я просто не знаю, что я ищу.

У меня есть логическая переменная под названием inputs, которая сохранила 32 бита true/false из библиотеки интерфейса ModBus.

Вот изображение, объясняющее мои 32 значения true/false. В основном эти 32 значения true/false хранятся во входных данных. Мне нужно сопоставить их в одно 32-битное целое число.

Я хочу знать, как сопоставить эти 32 значения в одну 32-битную строку, то есть (0000 0000 0000 1000 1000 1000 1000 1000), которая, очевидно, будет 32-битным целым числом и даст мне десятичное число 88888.

И я просто застрял сейчас, потому что я не уверен, какую команду я должен использовать.


person Bidaum92    schedule 30.01.2016    source источник
comment
А Int32 или UInt32?   -  person ryanyuyu    schedule 30.01.2016
comment
Я только что добавил редактирование с изображением. Это более понятно? В основном эти 32 значения true/false хранятся во входных данных. Мне нужно сопоставить их в одно 32-битное целое число. Который затем даст мне число в конце.   -  person Bidaum92    schedule 30.01.2016
comment
Вы хотите знать, сколько у вас истинных и ложных буланов? переменная boelan может быть только treu/false. Если вы хотите узнать, сколько из них истинны, а сколько ложны, вам нужно создать цикл и две переменные типа int с именами: int AmountTrue int Amountfalse и добавить значение к этой переменной в зависимости от цели цикла.   -  person ThunD3eR    schedule 30.01.2016
comment
Извините, нет, я не хочу знать, сколько из них правда и ложь. Я хочу иметь возможность сопоставлять каждые 1 и 0 в одну 32-битную строку, то есть (0000 0000 0000 1000 1000 1000 1000 1000), которая, очевидно, будет 32-битным целым числом и даст мне десятичное число 88888.   -  person Bidaum92    schedule 30.01.2016
comment
Как обычно, в .NET для этого есть тип. БитВектор32.   -  person Hans Passant    schedule 30.01.2016
comment
Это не дубликат. Первый дубликат запрашивает другое направление преобразования (и большинство ответов там беспорядочно основаны на строках). Второй дубликат явно начинается со строки, а не с логической последовательности. Здесь можно предложить как минимум два хороших ответа, не основанных на строках. Вы можете использовать BitVector32, как предлагает Ганс, но это немного более необходимо (особенно без MoreLinq), чем простое использование bitsHighToLow.Aggregate(0, (i, b) => (i << 1) + (b ? 1 : 0)).   -  person William    schedule 17.10.2016


Ответы (4)


Просто небольшая манипуляция:

uint i = 0;
var boolArr = new[] { true, false, true }; // 0b101
foreach (var bit in boolArr)
{
    // perform a bitwise left shift by 1 position
    // equivalent to multiplying i by 2
    i <<= 1;

    // store the bool value in the LSB of i
    i |= (uint)(bit ? 1 : 0);
}
Console.WriteLine(i);

Выведет значение 5.

Или однострочный:

val = Convert.ToUInt32(string.Join("",
          bools.Select(b => b ? 1 : 0)), 2);
person James Buck    schedule 30.01.2016
comment
Становимся ближе. Но я получаю сообщение об ошибке Error CS0266 Cannot implicitly convert type 'int' to 'uint'. An explicit conversion exists (are you missing a cast?) Если я изменю uint на int, это сработает, но, очевидно, я получу отрицательные значения. - person Bidaum92; 30.01.2016
comment
@ Bidaum92, в чем ошибка? - person James Buck; 30.01.2016
comment
только что отредактировал комментарий с ошибкой - person Bidaum92; 30.01.2016
comment
@ Bidaum92 о да, извините, я сначала пропустил актерский состав. Добавьте приведение (uint) в строку 4 моего кода. - person James Buck; 30.01.2016

Когда у вас есть строковое значение в битах, вам просто нужно преобразовать эту строку, используя

  int output = Convert.ToInt32(input, 2);

Здесь был дан ответ.

Преобразование двоичной строки в целое число

person Maertin    schedule 30.01.2016

Я думаю, это то, что вы хотите. booleans будет вашим логическим массивом, тогда ints инициализируется (необходимо) длиной логического массива, поскольку он одинаков. i — это просто счетчик, который мы используем в цикле foreach. Затем вы увеличиваете i и конвертируете одно логическое значение из массива в целое число и сохраняете его в массиве int. Последняя строка объединяет все целые числа. В примере, зная, что True = 1 и False = 0, у вас есть TFTF, затем ints = 1, 0, 1, 0 и int result = 1010

                bool[] booleans = { true, false, true, false }; // Your bool array
                int[] ints = new int[booleans.Length];  // Integer equivalent of "booleans"
                int i = -1; // Counter for "foreach" loop
                foreach (bool boo in booleans)
                {
                    i++;
                    ints[i] = Convert.ToInt32(boo); // Convert boolean into binary
                }
                int result = Convert.ToInt32(string.Join("", ints)); // Concatenate them

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

person TheCrimulo    schedule 30.01.2016
comment
Да, мне нужен краткий курс.. просто чтобы я мог понять терминологию.. и затем смог лучше использовать свое гугл-фу! Извиняюсь за отсутствие информации.. еще раз это из-за недостатка знаний с моей стороны. - person Bidaum92; 30.01.2016

Если вы хотите лучшего понимания (Джеймс, похоже, прав), взгляните на это (вы можете просто скопировать и вставить в Linqpad, в противном случае удалите Dump() вызовы и используйте ToString()):

// Initialize variables
bool[] ba = new bool[24];
Random r = new Random();
StringBuilder sb = new StringBuilder();
Int32 i32 =0;

// Initialize array
for (int i = 0; i < ba.Length; i++)
{
    var d = r.Next(0,10);
    ba[i] = (d < 5) ? true : false;
}

// Dump to string: 
for (int i = 0; i < ba.Length; i++)
{
    sb.Append( ba[i] ? 1 : 0);
}

// Build your int
for (int i = 0; i < ba.Length; i++)
{
    // Shift left
    i32 = i32 << 1;
    // Add your current value
    i32+= ba[i] ? 1 : 0;
}

// Outputs
ba.Dump("array output");
sb.ToString().Dump("as a string");
i32.Dump("as an int");

Следующее также должно быть полезно: ‹‹ Оператор (справочник по C#) или этот вопрос.

person Noctis    schedule 30.01.2016