4

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

4 回答 4

6
int num1 = 4;
int num2 = 156;
int num = (num2 << 3) | num1;

然后你可以num2通过向右移动 3 来阅读

int num2Read = num >> 3

你读起来num1像(你正在创建一个类似于掩码的东西,它是 num 的前 3 位)

int num1Read = num & 7

这样,第一个数字可以是3位,第二个数字可以任意长

于 2013-07-08T11:24:11.190 回答
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

于 2013-07-08T11:20:13.147 回答
0

使用or代替and操作。IE

byte mybite = (byte)(val1 | val2);

如果 val1 为 0000-0010 (2) 而 val2 为 1000-0000 (128),则and( &) 将导致 0000-0000,而or( |) 将导致 1000-0010 (130)。

于 2013-07-08T11:22:32.830 回答
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被覆盖。

于 2013-07-08T11:52:20.643 回答