【问题标题】:Combine two sbytes into int将两个 sbyte 组合成 int
【发布时间】:2015-07-18 15:33:58
【问题描述】:

我有两个字节。我怎么必须通过忽略每个字节的最高有效位来组合这两个字节。

实际上两个字节是有符号字节。所以我必须忽略最高有效位并连接剩余的 7 个位。

这是我的简单示例代码。我得到每个字节的最后 7 位。然后我将第一个字节左移 7 并添加第二个字节。但是它没有给出正确的结果。

byte b1 = 131; // 10000011
byte b2 = 96;  // 01100000

//Ignoring most significant bit and get 7 remaining bits.
byte t1 = (byte) (b1 & 127); // 0000011 in 8-bits saved as 00000011
byte t2 = (byte) (b2 & 127); // 1100000 in 8-bits saved as 01100000

// Left shift first byte by 7. and add the second byte
// t1:  00000011 0000000
// t2:         0 1100000  +
//      00000011 1100000  =
int ut1t2 = t1 << 7 + t2; // 480 is expected but it gives 384

【问题讨论】:

  • 要进行按位运算,请使用|+ 用于算术运算。并使用b1 &amp; 0x7f 使意图更清晰,因为您可以看到要作用的真正二进制值

标签: c# byte


【解决方案1】:

你得到一个错误的结果,因为&lt;&lt; has lower precedence then +。您可以使用不带括号的| 来执行此操作(在位上操作时,按位或比+ 更常见)

int ut1t2 = t1 << 7 | t2;

或者甚至在一行中完成,像这样:

int ut1t2 = ((b1 & 127) << 7) | (b2 & 127);

【讨论】:

  • 谢谢。我想我会使用| 运算符。看起来更干净。 + 和 | 之间也有任何性能差异吗? ?
  • @M.kazemAkhgary 在现代 CPU 上没有区别。即使是较旧的 CPU 也会使用前瞻加法器在单个周期内进行加法。
【解决方案2】:

缺少括号:(

int ut1t2 = (t1 << 7) + t2; // returns 480!

你所拥有的相当于:

int ut1t2 = t1 << (7 + t2);

【讨论】:

  • 哦。我现在觉得很傻!我不知道 + 运算符的优先级高于
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多