给定Byte
(例如0x49(,我想将高位半字节从4
更改为7
。
即:
0x49
→0x79
我尝试过以下操作:
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));