组合三位以获得单个整数值

时间:2015-10-14 15:03:05

标签: c embedded bit-manipulation

所以我有三个变量,每个变量持有1或0.这三个变量在组合时形成地址0 - 7。例如     var1 = 1;     var2 = 0;     var3 = 1;

将是5.

我如何将这三个变量组合起来得到一个整数值?我听说过位移操作是最好的方法,但我不知道怎么做。感谢。

6 个答案:

答案 0 :(得分:3)

  1. 确保值为0或1以确保安全:AND与1执行此操作
  2. 将这些0/1值移动到正确的位置:使用<<运算符
  3. 完成
  4. 合并它们:或者这些值
  5. 如果var1 = 1; var2 = 0; var3 = 0应为4,请使用此:
    ((var1 & 1) << 2) | ((var2 & 1) << 1) | (var3 & 1)

    如果var1 = 1; var2 = 0; var3 = 0应为1,请使用此:
    ((var3 & 1) << 2) | ((var2 & 1) << 1) | (var1 & 1)

答案 1 :(得分:2)

var1 = 1,var2 = 0,var3 = 1,var4 = 1,var5 = 0,var6 = 0,var7 = 1,var8 = 0

字节=(var1&lt;&lt; 7)+(var2&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; /&gt;&gt; 2)+(&var7 LT;&LT; 1)+ var8;

字节值为10110010

答案 2 :(得分:1)

这有效:

您将第一位向左移位2位,其中&lt;&lt;在图2中,第二位向左1位,其中&lt;&lt; 1,最后一点留下最后一点。 这给你3个变量,现在是100,000和001,然后你或者它们和|一起获得101即5。

v1目前是二进制001,你希望它是第3位,即。 100,所以你需要将它向左移动pred(userPred, OutputList) :- findall(myTerm(X,Y,Z), myTerm(X,Y,Z), OutputList), split_here, member(myTerm(X,_,_), OutputList), use_x(X).

同样,v2当前为000,你想要0为第2位,所以你将它1移到左边(v1 << 2)给000(在这种情况下是微不足道的,但明显不同于1)

最后,v3是001,你希望它是第3位......已经是这样我们可以把它放在原来的位置。

最后将它们,我们或值与(v2 << 1)

组合在一起

100 |

000 |

001 =

101 = 5二进制

|

答案 3 :(得分:1)

为了获得真正的答案,您需要定义哪个变量属于您尝试计算的二进制数中的位位置,并确保将每个变量的值设置为零或一个或者您和#39;将在结果中移动错误的位。

在下面的代码示例中,从左到右读取的位顺序是var3,var2,var1。 var3被称为最高有效位,var1被称为最低有效位。

如果希望值为1,则将var1设置为1,然后将var2和var3设置为0。 如果希望值为4,则将var1和var2设置为0,然后将var3设置为1。 如果希望值为5,则将var1和var3设置为1,然后将var2设置为0。

<View>
    <Query>
        <Where>
            <Eq>
                <FieldRef Name="Internal_Name_of_field" />
                <Value Type="Text">The value to filter against</Value>
            </Eq>
        </Where>
        <OrderBy>
            <FieldRef Name="Internal_Name_of_field" />
        </OrderBy>
    </Query>
    <RowLimit>500</RowLimit>
</View>

如果您想要一个更容易理解的版本,可以使用以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int var1=1;
    int var2=0;
    int var3=1;
    int res=(var3 << 2) + (var2 << 1) + var1;
    printf("%d\n",res);
    return 0;
}

我理解使用#include <stdio.h> #include <stdlib.h> int main(void){ int LeastSignificantBit=1; int MiddleBit=0; int MostSignificantBit=1; int Number=0; Number=(MostSignificantBit << 2) + (MiddleBit << 1) + (LeastSignificantBit << 0); printf("Number is %d\n",Number); return 0; } 是过度的,但我说明了最低有效位不需要移位的事实。

答案 4 :(得分:0)

当您移位某个数字时,您将在内存中从右向左移动。因此,正如我们所知,如果我们将数字向左移动,它将乘以2,因为计算机的基数是二进制的。如果我们向右移动,它将被除以2。

像这样:

十进制5 - &gt;二进制00101 十进制10 - &gt;二进制01010

请注意,我们只是向左移动了一次,我们得到的结果为5乘以2,因此为10。

在你的代码中,我建议你通过scanf接收变量,继续移动它们然后求它们,如下:

#include <stdio.h>

int main(){
    int var1, var2, var3;
    scanf("%d %d %d", &var1, &var2, &var3);
    printf("%d\n", (var1 << 2) + (var2 << 1) + var3);
    return 0;
}

上面的代码我们把变量__&lt;&lt; __ number_of_shifts。因此,在第一个中,我们将var1移位两次,第二个移位一次,最后一个移位无。然后我们一起总结并得到你的答案!

答案 5 :(得分:0)

如果输入变量保证值为1或0,则:

address = (var1 << 2) | (var2 << 1) | var3 ;

将完全按照你的意愿行事;但是,如果var1等是整数,则在未检查或限制前提条件的情况下,将生成无效且可能超出范围的地址。

允许简单地址范围扩展的更灵活和可维护的实现是使用数组而不是三个单独的变量。事实上,你在第一时间编号,而不是建议一个数组在任何情况下都可能是合适的):

#define ADDR_BITLEN 3
unsigned var[ADDR_BITLEN] ;

...

unsigned address = 0 ;
for( int bit = ADDR_BITLEN - 1; bit >= 0; bit++ )
{
    address |= ((var[bit] == 0) ? 0 : 1) << bit ;
}

现在只需更改unsigned即可address ADDR_BITLEN的{​​{1}}位长度以上的任意位数,循环体确保无效地址为如果address_bits[bit]是&gt;则不会生成1通过明确地选择0或1,如果不使用数组和循环,这将有点麻烦并且难以阅读和维护。