Как установить старший полубайт байта? - PullRequest
0 голосов
/ 06 мая 2020

Учитывая Byte (например, 0x49), я хочу изменить старший полубайт с 4 на 7.

То есть:

0x490x79

Я пробовал следующее:

Byte b = 0x49;
b = 0x70 | (b & 0x0f);

Но он не компилируется:

Ошибка компиляции: не может быть неявно преобразовать тип int в byte. Существует явное преобразование (отсутствует ли приведение?)

Что я делаю не так?

CMRE

using System;

public class Program
{
    public static void Main()
    {
        //The goal is to change the high nibble of 0x49 from 4 to 7.  That is 0x49 ==> 0x79
        Byte b = 0x49;
        b = b & 0x0f;
        b = 0x70 | b;
        Console.WriteLine(b.ToString());
    }
}

https://dotnetfiddle.net/V3bplL

Я пробовал отливать каждую деталь, которую могу найти, как (Byte), но она все равно жалуется. И вместо того, чтобы стрелять из жесткой пушки по коду и надеяться, что что-то прилипнет, я решил, что получу правильный ответ.

Вот почему пример кода не содержит (Byte) приведений:

  • в этом нет необходимости
  • Я хочу, чтобы кто-то еще объяснил мне, где именно, и именно почему , это или они это или необходимы

Отсюда легко щелкнуть ссылку dotnetfiddle. Люди могут попробовать это для себя, добавить (Byte) приведение, увидеть, что он не компилируется, go «Ха» , и попробовать добавить больше приведения в случайном порядке.

Для тех, кто этого не сделал. Не прочитал

Для педантов, которые не удосужились попробовать:

Byte b = (Byte)0x49;
b = ((Byte)0x70) | ((Byte)(((Byte)b) & ((Byte)((Byte)0x0f))));

тоже не сработает.

1 Ответ

2 голосов
/ 06 мая 2020

Управление битом a Byte возвращает an Int32:

  • Byte & ByteInt32
  • Byte | ByteInt32

Таким образом, вам нужно выполнить приведение, чтобы ваши промежуточные выражения не интерпретировались как int:

Byte b = 0x49;
b = (Byte)(b & 0x0f);
b = (Byte)(0x70 | b);

Или просто:

Byte b = 0x49;
b = (Byte)(0x70 | (b & 0x0f));
...