C# 两个';s补码转换
我需要将2的补码格式的字节转换为正整数字节。 范围-128到127映射到0到255C# 两个';s补码转换,c#,twos-complement,C#,Twos Complement,我需要将2的补码格式的字节转换为正整数字节。 范围-128到127映射到0到255 Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 编辑为了消除混淆,输入字节(当然)是0到255范围内的无符号整数。但它使用2的补码格式表示-128到127范围内的有符号整数。例如,输入字节值128(二进制10000000)实际上表示-128 额外编辑好的,假设我们有以下字节流0255254,1127。在2的补码格式中,这表示0
Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc.
编辑为了消除混淆,输入字节(当然)是0到255范围内的无符号整数。但它使用2的补码格式表示-128到127范围内的有符号整数。例如,输入字节值128(二进制10000000)实际上表示-128
额外编辑好的,假设我们有以下字节流0255254,1127。在2的补码格式中,这表示0,-1,-2,1127。这我需要夹持到0到255的范围。有关更多信息,请查看这篇难找的文章:从您想要的示例输入:
sbyte something = -128;
byte foo = (byte)( something + 128);
你可以描述一些简单的事情,比如给你的数字加上一个偏差(在本例中,给有符号的数字加上128)
答对了:-)如果我理解正确,您的问题是如何转换输入,它实际上是一个有符号字节(),但该输入存储在一个无符号整数中,然后通过将其转换为零来避免负值 需要明确的是,当您使用有符号类型(如
ubyte
)时,框架在幕后使用了Two's complete
,因此只要将其转换为正确的类型,您就可以使用Two's complete
然后,一旦转换完成,就可以使用简单的if
或条件三元运算符()钳制负值
对于值从128到255(或从-128到-1),下面显示的函数将返回0
,对于值从0到127
,函数将返回相同的值
因此,如果必须使用无符号整数作为输入和输出,则可以使用如下内容:
private static uint ConvertSByteToByte(uint input)
{
sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1
if (properDataType < 0) { return 0; } //when negative just return 0
if (input > 255) { return 0; } //just in case as uint can be greater than 255
return input;
}
sbyte test1 = -1;
byte test2 = (byte)test1;
专用静态uint转换器字节到字节(uint输入)
{
sbyte properDataType=(sbyte)输入;//128..255将被视为-128..-1
如果(properDataType<0){return 0;}//为负数时只返回0
if(input>255){return 0;}//以防万一,因为uint可以大于255
返回输入;
}
或者,IMHO,您可以将输入和输出更改为最适合您的输入和输出的数据类型(sbyte和byte):
专用静态字节转换器SByteTobyte(sbyte输入)
{
返回输入<0?(字节)0:(字节)输入;
}
试试看
或
xor MSB,仅此而已我认为2s补码字节最好使用以下方法完成。也许不优雅或不短,但清晰和明显。我将把它作为一个静态方法放在我的一个util类中
public static sbyte ConvertTo2Complement(byte b)
{
if(b < 128)
{
return Convert.ToSByte(b);
}
else
{
int x = Convert.ToInt32(b);
return Convert.ToSByte(x - 256);
}
}
公共静态sbyte CONVERTO2COMPLEMENT(字节b)
{
if(b<128)
{
返回Convert.ToSByte(b);
}
其他的
{
int x=转换为32(b);
返回Convert.ToSByte(x-256);
}
}
对于大于8位的数字,这是我的解决方案。我的例子是16位值。注意:您必须检查第一位,看它是否为负数
步骤:
在变量前加上“~”将#转换为恭维。(即y=~y)
将#s转换为二进制字符串
将二进制字符串拆分为字符数组
从最右边的值开始,添加1,跟踪进位。将结果存储在字符数组中
将字符数组转换回字符串
private string TwosComplimentMath(string value1, string value2)
{
char[] binary1 = value1.ToCharArray();
char[] binary2 = value2.ToCharArray();
bool carry = false;
char[] calcResult = new char[16];
for (int i = 15; i >= 0; i--)
{
if (binary1[i] == binary2[i])
{
if (binary1[i] == '1')
{
if (carry)
{
calcResult[i] = '1';
carry = true;
}
else
{
calcResult[i] = '0';
carry = true;
}
}
else
{
if (carry)
{
calcResult[i] = '1';
carry = false;
}
else
{
calcResult[i] = '0';
carry = false;
}
}
}
else
{
if (carry)
{
calcResult[i] = '0';
carry = true;
}
else
{
calcResult[i] = '1';
carry = false;
}
}
}
string result = new string(calcResult);
return result;
}
所以问题是OP的问题实际上不是二的补码转换。他给一组值添加了一个偏差,将范围从-128..127调整到0..255
要实际执行2的补码转换,只需将有符号值转换为无符号值,如下所示:
private static uint ConvertSByteToByte(uint input)
{
sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1
if (properDataType < 0) { return 0; } //when negative just return 0
if (input > 255) { return 0; } //just in case as uint can be greater than 255
return input;
}
sbyte test1 = -1;
byte test2 = (byte)test1;
-1变成255-128变成128。不过,这听起来不像OP想要的。他只想向上滑动一个数组,使最低的有符号值(-128)变成最低的无符号值(0)
要添加偏差,只需执行整数加法:
newValue = signedValue+128;
字节
未签名,您想做什么?我仍然不完全确定这里尝试了什么。这可能是所有答案给你的方式,或者你对2的补码表示理解不正确。由于我找不到bingo
关键字,我编辑了你的答案以确保可读性:-)“old”是原始字节值还是它的转换?如果是原始字节值,则给出错误答案。如果是后者,那么这就是我所要求的过程。@Yehonatan:但是你想如何在0到255的范围内表示-1?这看起来不像是C#到meThis,这并没有实现OPs规定的目标。他希望-128变成0。这只是一个整数加法。结果=有符号字节+128;
public static sbyte ConvertTo2Complement(byte b)
{
if(b < 128)
{
return Convert.ToSByte(b);
}
else
{
int x = Convert.ToInt32(b);
return Convert.ToSByte(x - 256);
}
}
private string TwosComplimentMath(string value1, string value2)
{
char[] binary1 = value1.ToCharArray();
char[] binary2 = value2.ToCharArray();
bool carry = false;
char[] calcResult = new char[16];
for (int i = 15; i >= 0; i--)
{
if (binary1[i] == binary2[i])
{
if (binary1[i] == '1')
{
if (carry)
{
calcResult[i] = '1';
carry = true;
}
else
{
calcResult[i] = '0';
carry = true;
}
}
else
{
if (carry)
{
calcResult[i] = '1';
carry = false;
}
else
{
calcResult[i] = '0';
carry = false;
}
}
}
else
{
if (carry)
{
calcResult[i] = '0';
carry = true;
}
else
{
calcResult[i] = '1';
carry = false;
}
}
}
string result = new string(calcResult);
return result;
}
sbyte test1 = -1;
byte test2 = (byte)test1;
newValue = signedValue+128;