将2个数字插入一个字节

时间:2013-07-08 11:16:24

标签: c#

我需要将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));

提前致谢。

4 个答案:

答案 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中的某些位被覆盖。