本文介绍了移入.NET的符号位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是从一个单色位图阅读位。我存储每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:

移入.NET的符号位-LMLPHP

如果你想有一个的逻辑的移位(无符号扩展),使用无符号数

If you want a logical shift (no sign extension), use unsigned numbers:

移入.NET的符号位-LMLPHP

这篇关于移入.NET的符号位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 10:00