Путаница в C # - PullRequest
       28

Путаница в C #

1 голос
/ 16 июня 2009

У меня есть какой-то старый код, подобный этому:

private int ParseByte(byte theByte)
{
        byte[] bytes = new byte[1];
        bytes[0] = theByte;
        BitArray bits = new BitArray(bytes);

        if (bits[0])
            return 1;
        else
            return 0;
}

Это долго, и я решил, что смогу урезать его так:

private int ParseByte(byte theByte)
{
         return theByte >> 7;
}

Но я не получаю те же значения, что и первая функция. Байт содержит 00000000 или 10000000. Что мне здесь не хватает? Я использую неправильный оператор?

Ответы [ 7 ]

4 голосов
/ 16 июня 2009

Проблема в том, что в первой функции биты [0] возвращают младший значащий бит, а вторая функция возвращает старший значащий бит. Чтобы изменить вторую функцию, чтобы получить младший значащий бит:

private int ParseByte(byte theByte)
{
    return theByte & 00000001;
}

Чтобы изменить первую функцию для возврата старшего значащего бита, вы должны использовать биты [7], а не биты [0].

3 голосов
/ 16 июня 2009

Эквивалентная функция для первого фрагмента:

return theByte & 1 == 1

Во втором фрагменте вы были отмечены наиболее значимым битом, а в первом - наименее значимым.

1 голос
/ 16 июня 2009

Вы хотите вернуть int или string? В любом случае - вы можете использовать по модулю:

return theByte % 2 == 0 ? "0" : "1"

ОК, вы редактировали ... и хотите вернуть int

Слово вашей операции сдвига: вам придется использовать << вместо >>. Но это возвращает (когда вы приводите к байту вместо int) 0 или 128, а не 0 или 1. Таким образом, вы можете переписать ваше второе решение как:

return (byte)(theByte << 7) == 128 ? 1 : 0;

Но другие ответы содержат действительно лучшие решения, чем этот.

0 голосов
/ 16 июня 2009

1st Первая функция не работает, так как она пытается вернуть строку вместо int.

Но то, что вы могли бы хотеть, это:

    private static int ParseByte(byte theByte)
    {
        return theByte & 1;
    }

Однако вы также можете захотеть это:

    private static string ParseByteB(byte theByte)
    {
        return (theByte & 1).ToString();
    }
0 голосов
/ 16 июня 2009

По словам пользователя на сайте Microsoft , BitArray внутренне хранит биты в Int32 в порядке с прямым порядком байтов в битовом порядке. Это может вызвать проблему. Для решения и дополнительной информации вы можете посетить ссылку.

0 голосов
/ 16 июня 2009

У вас есть дополнительный ноль в ваших двоичных числах (у вас есть 9 цифр в каждом). Я предполагаю, что это просто опечатка.

Вы уверены, что делаете заказ правильно? Двоичный код традиционно пишется справа налево, а не слева направо, как большинство других систем нумерации. Если двоичное число, которое вы показали, отформатировано в свойстве (это означает, что 10000000 действительно число 128, а не число 1), тогда ваш первый фрагмент кода не должен работать, а второй должен. Если вы пишете это задом наперед (то есть 10000000 означает 1, а не 128), вам даже не нужно сдвигать биты. Просто И это с 1 (theByte & 1).

На самом деле, независимо от подхода побитовое И (оператор &) кажется более подходящим. Учитывая, что ваша первая функция работает, а вторая - нет, я предполагаю, что вы просто записали число в обратном направлении, и вам нужно AND с 1, как описано выше.

0 голосов
/ 16 июня 2009

Возможно, первая функция должна проверять биты [7]?

...