我需要将2位数据插入一个字节。
前3位(0,1,2)包含1到5之间的数字。
最后5位(3,4,5,6,7)包含0到25之间的数字。[编辑:从250改变]
我试过了:
byte mybite = (byte)(val1 & val2)
但老实说我真的不知道我在做位操作的事情,虽然我从早期的帖子中读到这些信息有一些帮助,这很棒。
这是我从一个字节读取信息的方式:
// Advanced the position of the byte by 3 bits and read the next 5 bits
ushort Value1 = Convert.ToUInt16((xxx >> 3) & 0x1F);
// Read the first 3 bits
ushort Value2 = Convert.ToUInt16((xxx & 0x7));
提前致谢。
答案 0 :(得分:6)
int num1 = 4;
int num2 = 156;
int num = (num2 << 3) | num1;
然后你可以通过向右移动
来阅读num2
int num2Read = num >> 3
你读num1
喜欢(你正在制作类似掩码的东西,而且是前3位的数字)
int num1Read = num & 7
这样,第一个数字可以是3位,第二个数字可以任意长
答案 1 :(得分:1)
(如果我理解你的问题,你想在某个位置添加位)
字节为xxxx-xxxx
所以,如果你想“添加”到最右边的位:xxxx-xxxY
byte b=...
b=b | 1
如果您想添加到第二最右位:xxxx-xxYx
b=b | 2
如果您想添加到第三个最右边的位:xxxx-xYxx
b=b | 4
如果您想添加到第四最右位:xxxx-Yxxx
b=b | 8
如果您想添加到第五最右位:xxxY-xxxx
b=b | 16
不同的例子:
如果你想添加14:
只是做
b=b | 14
它会使xxxx-YYYx
位上升
答案 2 :(得分:0)
使用or
代替and
操作。 IE
byte mybite = (byte)(val1 | val2);
如果val1为0000-0010(2)且val2为1000-0000(128),and
(&
)将导致0000-0000,而or
({{ 1}})将导致1000-0010(130)。
答案 3 :(得分:0)
如果我理解你的问题是正确的,那么你正在寻找与你提出的问题相反的操作。
以下是你如何做到这一点(丑陋的代码与演员等,但显示了比特发生了什么):
byte source = 0xA3; // source = 10100011 = 163
// get bits from source
byte lowbits = (byte)((int)source & 7); // lowbits = 00000011 = 3
byte highbits = (byte)((int)source >> 3); // highbits = 00010100 = 20
请注意,此时lowbits
包含的值介于0到7之间(不是0和5 ),而highbits
包含介于两者之间的值0和31(不是0和250 )。
// use bits to create copy of original source
byte destination = (byte)(((int)highbits << 3) | (int)lowbits); // destination = 10100011
另请注意,如果highbits
包含大于31的值,则此操作将删除某些位。如果lowbits
包含大于7的值,则可能会导致highbits
中的某些位被覆盖。