【问题标题】:Read and write negative numbers with bits [duplicate]用位读写负数[重复]
【发布时间】:2020-10-27 08:24:13
【问题描述】:

因此,使用下面的代码,我可以将一个数字(例如 2047)保存到使用位中,然后将其读回,它将显示 2047。如果我想对负数执行此操作(例如-2048)

string text = "";
int cnt = 11;
List<int> bits = new List<int>();
for (int i = 11; i >= 0; i--)
{
    int t = (-2048 >> i) & 1;
    bits.Add(t);
}
int value=0;
for(int i=0;i<bits.Count;i++)
{
    text += bits[i];
    value &= ~(1 << cnt);

    if (bits[i] == 1)
    {
        value |= 1 << cnt;
    }
    else
    {
        value |= 0 << cnt;
    }

    cnt--;
}
MessageBox.Show(value+ " " +text);

我希望它使用的数字范围是 -2048 到 2047

【问题讨论】:

  • 所以你想将一个 int 转换成它在字符串中的二进制表示?
  • 这个答案对你有帮助吗stackoverflow.com/a/6790760/697188 或者你需要写实际的算法来做这个家庭作业吗?
  • 请改进问题。就目前而言,您似乎只是误解了数字的二进制表示。您对 int 值列表的解码失败,因为您没有考虑原始值中存在的其他设置位。见重复。如果您想编码更少的位,然后将解码后的值存储回传统的整数数据类型,则需要检查编码的最高有效位,并将其复制到解码值中剩余的更高功率位。跨度>

标签: c# bit bit-shift


【解决方案1】:

经过一段时间的思考,我想通了。只需在输出前添加以下代码

if(value> 2047)
{
    value -= 4096; 
}

然后 -2048 实际上会显示 -2048 而不是 2048

【讨论】:

  • 这将适用于您的特定情况,但该解决方案不能很好地概括。也就是说,这肯定是对解码值进行符号扩展的一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2011-09-04
  • 2012-10-27
相关资源
最近更新 更多