在.NET中移动符号位

Din*_*nah 13 .net c# bit-shift

我正在从单色位图中读取位.我short以相反的顺序将每16位存储在a 中.如果位图中的位为黑色,则存储1.如果为白色,则存储0.

例如:对于位图:bbbw bbbw bbbw wwww
我的简称是:0000 0111 0111 0111

我尝试这样做的第一种方式是:

short m;
// ...
Color c = bmp.GetPixel(j, i);
if (c.R == Color.Black)
    m |= short.MinValue;
m >>= 1;
// ...
Run Code Online (Sandbox Code Playgroud)

经过一次任务和班次后,我得到了预期的-32768(1000 0000 0000 0000).
第二次我得到-16384(1100 0000 0000 0000).

我更改了我的代码使用ushort并将if行更改为s |= (ushort)Math.Pow(2, 15);现在它的工作原理.

我的问题是:为什么标志位不会在.NET中转移?有没有办法改变标志位?

Rob*_*ino 31

在C#中,移位是算术移位(与逻辑移位相反).在正确的算术移位中,符号位在左侧移入,因此保留了数字的符号.右移相当于除以2:

替代文字

如果您想要逻辑移位(无符号扩展名),请使用无符号数字:

替代文字

  • 值得注意的是,如果由于某些其他原因不适合,则“使用无符号数字”不一定适用于整个方法。`m = (short)((ushort) >> 1)` 将使编译器发出 `shr.un` 进行无符号移位,而不进行任何强制转换操作;C# 中存在的强制转换并不存在于 CIL 中,它只是知道您希望此时将其视为无符号。 (2认同)

Lib*_*cks 5

http://msdn.microsoft.com/en-us/library/k2ay192e.aspx

">>"运算符将表达式1的位向右移动表达式2中指定的位数.表达式1的符号位用于填充左侧的数字.向右移位的数字将被丢弃.表达式1的数据类型确定此运算符返回的数据类型."