Противоположный метод сложения математических чисел - PullRequest
3 голосов
/ 25 мая 2010

У меня есть метод для преобразования массива логических значений в целое число. Похоже, это

class Program
    {
        public static int GivMeInt(bool[] outputs)
        {
            int data = 0;
            for (int i = 0; i < 8; i++)
            {
                data += ((outputs[i] == true) ? Convert.ToInt32(Math.Pow(2, i)) : 0);
            }
            return data;

        }

        static void Main(string[] args)
        {
            bool[] outputs = new bool[8];
            outputs[0] = false;
            outputs[1] = true;
            outputs[2] = false;
            outputs[3] = true;
            outputs[4] = false;
            outputs[5] = false;
            outputs[6] = false;
            outputs[7] = false;
            int data = GivMeInt(outputs);
            Console.WriteLine(data);
            Console.ReadKey();
        }
   }

Теперь я хочу сделать противоположный метод, возвращающий массив логических значений Так как до настоящего момента у меня не хватало знаний о .NET и C #, у меня есть только мое умственное программирование оператора switch или условий для каждого возможного значения типа int.

public static bool[] GiveMeBool(int data)
        {
            bool[] outputs = new bool[8];

            if (data == 0)
            {
                outputs[0] = false;
                outputs[1] = false;
                outputs[2] = false;
                outputs[3] = false;
                outputs[4] = false;
                outputs[5] = false;
                outputs[6] = false;
                outputs[7] = false;
            }
            //After thousand lines of coed
            if (data == 255)
            {
                outputs[0] = true;
                outputs[1] = true;
                outputs[2] = true;
                outputs[3] = true;
                outputs[4] = true;
                outputs[5] = true;
                outputs[6] = true;
                outputs[7] = true;
            }
            return outputs;
        }

Я знаю, что должен быть более легкий путь.

Ответы [ 6 ]

8 голосов
/ 25 мая 2010

Вам необходимо использовать побитовые операторы: (проверено)

public static bool[] GiveMeBool(int data) {
    bool[] outputs = new bool[8];

    for(int i = 0; i < 8; i++)
        outputs[i] = (data & (1 << i)) == (1 << i);

    return outputs;
}

Вы также можете использовать побитовые операторы, чтобы сделать ваш оригинальный намного быстрее: (не проверено)

public static int GivMeInt(bool[] outputs) {
    int data = 0;
    for (int i = 0; i < 8; i++) 
        data += outputs[i] ? 1 << i : 0;

    return data;
}
2 голосов
/ 25 мая 2010

Используется битовое смещение.

public static bool[] GiveMeBool(Int32 data)
{
    bool[] bits = new bool[32];

    for (i = 0; i <= bits.Length - 1; i++) {
        bits(i) = (data & 1) == 1;
        data >>= 1;
    }

    return bits;
}
1 голос
/ 25 мая 2010

Я тестировал методы на Java. Единственное существенное отличие - ключевые слова bool против boolean.

public class Test {

    public static void main(String[] args) {
        boolean[] bools = new boolean[]{true,true,false,false,false,false,false,false};
        int num = GivMeInt(bools);
        boolean[] bools2 = GivMeBools(num);
        for(int i = 0; i < 8; i++) System.out.println(bools[i]==bools2[i]);
    }

    public static int GivMeInt(boolean[] outputs)
        {
            int data = 0;
            for (int i = 0; i < 8; i++)
            {
                if(outputs[i]) {
                    data += (1 << i);

                }
            }
            return data;
    }

    public static boolean[] GivMeBools(int input)
        {
            boolean[] outputs = new boolean[8];
            for (int i = 0; i < 8; i++)
            {
                outputs[i] = (input & 0x1) == 1;
                input = input >>> 1;
            }
            return outputs;

        }
}
1 голос
/ 25 мая 2010

Как насчет чего-то вроде следующего?

Int32 x = 0xFF33;
bool[] retval = new bool[32];
for (int i = 0; i < 32 && x != 0; i++, x = x >> 1)
{
    retval[i] = (x & 1) == 1;
}

Он использует сдвиг битов, чтобы творить магию.

1 голос
/ 25 мая 2010

Попробуйте это ...

public static bool[] GiveMeBool(int data)
{
    bool[] outputs = new bool[8];

    for (int i = 0; i < 8; i++)
        outputs[i] = (data & (int)Math.Pow(2, i)) != 0;

    return outputs;
}
1 голос
/ 25 мая 2010

Все это можно изменить, чтобы использовать растровые изображения , используя операторы сдвига .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...