【问题标题】:C# Bitwise OperatorsC# 位运算符
【发布时间】:2013-04-10 10:05:52
【问题描述】:

谁能解释一下以下代码的作用。

private int ReadInt32(byte[] _il, ref int position)
{
    return (((il[position++] | (il[position++] << 8)) | (il[position++] << 0x10)) | (il[position++] << 0x18));
}

我不确定我是否理解这种方法中的位运算符是如何工作的,能否请一些人为我分解一下?

【问题讨论】:

  • 我会把它改成return (((il[position] | (il[position+1] &lt;&lt; 8)) | (il[position+2] &lt;&lt; 0x10))(不回答问题,有人已经这样做了,只是position++的东西很难阅读而且没有必要)
  • @MatthewWatson,我同意它更有意义,但它似乎是在来自外部函数的缓冲区上的循环中使用的,因为 position 参数是 ref int 所以被调用者可能取决于正在更新的索引。不过,我会像你一样做,只需在末尾添加pos += 4
  • @ZdeslavVojkovic 啊,是的,完全正确。可能position += sizeof(int) 会更有表现力。
  • @MatthewWatson,对,我完全忘记了 C# 也有 sizeof 运算符。

标签: c# bit-manipulation


【解决方案1】:

整数以字节数组的形式给出。 然后将每个字节左移 0/8/16/24 位,并将这些值相加得到整数值。

这是一个十六进制格式的Int32

0x10203040

表示为如下字节数组(小端架构,所以字节是倒序的):

[0x40, 0x30, 0x20, 0x10]

为了从数组中重新构建整数,每个元素都被移位,即执行以下逻辑:

a = 0x40        = 0x00000040
b = 0x30 << 8   = 0x00003000
c = 0x20 << 16  = 0x00200000
d = 0x10 << 24  = 0x10000000

然后将这些值 OR'ed 在一起:

int result = a | b | c | d;

this gives:

0x00000040 |
0x00003000 | 
0x00200000 |
0x10000000 |
------------------
0x10203040

【讨论】:

  • 非常感谢,现在更有意义了! :)
【解决方案2】:

这样想:

var i1 = il[position];
var i2 = il[position + 1] << 8;  (<< 8 is equivalent to * 256)
var i3 = il[position + 2] << 16; 
var i4 = il[position + 3] << 24;

position = position + 4;

return i1 | i2 | i3 | i4;

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多