如何设置字节的高半字节



给定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)强制转换,如果编译失败,转到"Huh">,然后尝试随机添加更多强制转换。

对于那些不读书的人

对于那些懒得尝试的学究来说:

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

也会失败。

位操作Byte返回Int32:

  • Byte&Byte&rar;Int32
  • Byte|Byte&rar;Int32

因此,您需要进行强制转换,以免将中间表达式解释为int:

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

或者简单地说:

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

最新更新