问题描述
我是从一个单色位图阅读位。我存储每16位的短
以相反的顺序。如果位图中的位是黑色的,存储1.如果白色,存储0。
I'm reading bits from a monochrome bitmap. I'm storing every 16 bits in a short
in the reverse order. If the bit in the bitmap is black, store a 1. If white, store a 0.
例如:位图:BBBW BBBW BBBW WWWW
我的短是:0000 0111 0111 0111
E.g.: for bitmap: bbbw bbbw bbbw wwww
my short is: 0000 0111 0111 0111
我试图做到这一点的第一个方法是:
The 1st way I tried to do this was:
short m;
// ...
Color c = bmp.GetPixel(j, i);
if (c.R == Color.Black)
m |= short.MinValue;
m >>= 1;
// ...
一个指派和转变后,我得到了预期-32768(1000 0000 0000 0000)。
后的第二次我得到-16384(1100 0000 0000 0000)。
After one assignment and shift, I got the expected -32768 (1000 0000 0000 0000).
After the 2nd time I got -16384 (1100 0000 0000 0000).
我改变了我的code使用 USHORT
,改变了如果
行 S | =(USHORT)Math.Pow(2,15);
和现在的作品
I changed my code to use ushort
and changed the if
line to s |= (ushort)Math.Pow(2, 15);
and now it works.
我的问题是:为什么将符号位不是在.NET转型呢?有没有办法转移的符号位?
My question is: why will the sign bit not shift in .NET? Is there a way to shift the sign bit?
推荐答案
在C#中,位移是的算法的转变(相对于逻辑移位)。在右算术移位,符号位被移位在左侧,所以数字的符号是preserved。右移相当于分2:
In C#, shifts are arithmetic shifts (in contrast to logical shifts). In a right arithmetic shift, the sign bit is shifted in on the left, so the sign of the number is preserved. A right shift is equivalent to dividing by 2:
如果你想有一个的逻辑的移位(无符号扩展),使用无符号数
If you want a logical shift (no sign extension), use unsigned numbers:
这篇关于移入.NET的符号位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!