Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定一个位序列是正的还是负的_C#_C++_C_Algorithm_Bit Manipulation - Fatal编程技术网

C# 如何确定一个位序列是正的还是负的

C# 如何确定一个位序列是正的还是负的,c#,c++,c,algorithm,bit-manipulation,C#,C++,C,Algorithm,Bit Manipulation,我有两组值。每个都在-15到+15的范围内,包括0 我设法用8位来表示两个数字。这些位中的4位可能属于负数集,而另4位可能属于正数集 每当我读取该位序列时,我希望能够确定初始4位是+还是- 有没有一种方法可以通过对打包和解包都使用位操作来实现这一点?还是另一种聪明的方法 提前谢谢 更新:以下是我试图实现的一个示例: 在这31个值中,我只需要表示两个,使用8位,例如我有数字14+和15+。它们可以都是积极的,也可以各有一个,但不能都是消极的。所以14=1110和15=1111(去掉所有0);位序列

我有两组值。每个都在-15到+15的范围内,包括0

我设法用8位来表示两个数字。这些位中的4位可能属于负数集,而另4位可能属于正数集

每当我读取该位序列时,我希望能够确定初始4位是+还是-

有没有一种方法可以通过对打包和解包都使用位操作来实现这一点?还是另一种聪明的方法

提前谢谢

更新:以下是我试图实现的一个示例:

在这31个值中,我只需要表示两个,使用8位,例如我有数字14+和15+。它们可以都是积极的,也可以各有一个,但不能都是消极的。所以14=1110和15=1111(去掉所有0);位序列=11101111
因此,当解包时,我知道字节239=11101111,通过解析位序列,实际上分别表示数字14+和15+。然而,当其中任何一个数字都是负数时,我的日子就不好过了

使用位字段,您可以非常轻松地执行此操作:

struct two_numbers
{
     signed char first : 4;
     signed char second : 4;
};
然后您可以像正常情况一样将其与零进行比较:

two_numbers t = { 7, -5 };
if (t.first < 0 || t.second < 0) { ... }
两个_数t={7,-5};
如果(t.first<0 | | t.second<0){…}

但是,请注意,4位字段只允许-8到7之间的值,而不允许-15或15。

使用位字段可以很容易地做到这一点:

struct two_numbers
{
     signed char first : 4;
     signed char second : 4;
};
然后您可以像正常情况一样将其与零进行比较:

two_numbers t = { 7, -5 };
if (t.first < 0 || t.second < 0) { ... }
两个_数t={7,-5};
如果(t.first<0 | | t.second<0){…}

但是,请注意,4位字段只允许-8到7之间的值,而不允许-15或15。让我们假设您使用的是8位示例,其中使用高阶位表示负数,低阶位表示正数。如果根据0xF0屏蔽数字,且结果为非零,则数字为负数


解决这个问题的另一种方法是使用您的语言为字节值提供的任何方法。然后,您不需要做任何聪明的事情,只需测试值是否小于零。

假设您使用的是8位示例,其中高阶位表示负数,低阶位表示正数。如果根据0xF0屏蔽数字,且结果为非零,则数字为负数


解决这个问题的另一种方法是使用您的语言为字节值提供的任何方法。然后,您不需要做任何聪明的事情,只需测试值是否小于零。

选择一种语言。C和C++中最简单的方法在C语言中没有等价的,也需要5位来表示范围[-15:15]。在C、C++、C等中使用样本,我不介意哪种语言。你的描述是混乱的和不清楚的。您希望如何仅用4位表示31个值?你说“其中的4位可能属于一个负数集,而另4位可能属于正数集”——它们都是负数,还是都是正数,还是每个值都有一个?Jim,在这31个值中,我只需要用8位表示两个,比如说我有数字14+和15+。它们可以都是积极的,也可以各有一个,但不能都是消极的。所以14=1110和15=1111(去掉所有0);bitsequence=11101111。选择一种语言。C和C++中最简单的方法在C语言中没有等价的,也需要5位来表示范围[-15:15]。在C、C++、C等中使用样本,我不介意哪种语言。你的描述是混乱的和不清楚的。您希望如何仅用4位表示31个值?你说“其中的4位可能属于一个负数集,而另4位可能属于正数集”——它们都是负数,还是都是正数,还是每个值都有一个?Jim,在这31个值中,我只需要用8位表示两个,比如说我有数字14+和15+。它们可以都是积极的,也可以各有一个,但不能都是消极的。所以14=1110和15=1111(去掉所有0);bitsequence=11101111。我喜欢这种方法,但我确实需要它来处理-15或15。@ealva:这不是这种方法的限制,而是位的限制。范围-15到15(含15)有31个不同的整数值。四位只能提供16种不同的模式。你不能把16分之31(参考信息论)放在第一位。我喜欢这种方法,但我确实需要它来达到-15或15分。@ealva:这不是这种方法的局限性,它是位的局限性。范围-15到15(含15)有31个不同的整数值。四位只能提供16种不同的模式。16分之31是不合适的(参考信息论)