我需要将二进制补码格式的字节转换为正整数字节 . 范围-128到127映射到0到255 .
Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc.
EDIT 为了消除混淆,输入字节(当然)是0到255范围内的无符号整数 . 但是它表示使用二进制补码格式在-128到127范围内的有符号整数 . 例如,输入字节值128(二进制10000000)实际上表示-128 .
EXTRA EDIT 好的,我们假设我们有以下字节流0,255,254,1,127 . 在二进制补码格式中,它表示0,-1,-2,1,127 . 这需要钳位到0到255范围 . 欲了解更多信息,请查看这篇难以找到的文章:Two's complement
10 回答
从您的样本输入您只需要:
答对了 :-)
尝试
要么
xor MSB,就是这样
这是我对这个问题的解决方案,对于大于8位的数字 . 我的例子是16位值 . 注意:您必须检查第一位,看它是否为负数 .
脚步:
通过在变量前放置'〜'将#转换为赞美 . (即y = ~y)
将#s转换为二进制字符串
将二进制字符串分解为字符数组
从最右边的值开始,添加1,跟踪进位 . 将结果存储在字符数组中 .
将字符数组转换回字符串 .
您可能正在描述一些简单的事情,例如在您的号码中添加偏差(在这种情况下,为签名号码添加128) .
如果我没有正确地解决问题,你的问题是如何转换输入,这实际上是
signed-byte
(sbyte),但该输入存储在unsigned integer
中,然后通过将它们转换为零来避免负值 .需要说明的是,当你使用带符号的类型(如
ubyte
)时,框架在场景后面使用了Two's complement
,所以只需要转换为正确的类型,你将使用两个补码 .然后,一旦完成转换,就可以使用简单的
if
或条件三元运算符(?:)来钳制负值 .对于值
from 128 to 255
(或从-128到-1),下面给出的函数将返回0
,对于值from 0 to 127
,将返回the same value
.因此,如果必须使用无符号整数作为输入和输出,则可以使用以下内容:
或者,恕我直言,您可以将输入和输出更改为最适合您的输入和输出(sbyte和byte)的数据类型:
我相信2s补码字节最好用以下方法完成 . 也许不优雅或短暂但清晰明显 . 我会把它作为一个静态方法放在我的一个util类中 .
所以问题是OP 's problem isn' t真的是两个's complement conversion. He' s为一组值添加偏差,将范围从-128..127调整到0..255 .
要实际执行二进制补码转换,只需将带符号值转换为无符号值,如下所示:
-1变为255. -128变为128.但这听起来并不像OP想要的那样 . 他只想将数组向上滑动,以使最低有符号值(-128)成为最低无符号值(0) .
要添加偏差,您只需添加整数: