获取字节中特定位的值

时间:2014-04-25 17:03:36

标签: assembly binary mips

例如,我有这个二进制数: 00100101 我想创建一个新的数字,只有最后2位,其他0,如下所示: 00000001

我正在使用MIPS,所以我假设我必须使用逻辑或xor等的某种组合,但是到目前为止还没有成功。

3 个答案:

答案 0 :(得分:1)

执行此操作的MIPS指令是ANDI $t0, 0x3

答案 1 :(得分:0)

你只需要按位而且就此而言。这将返回字节中的前2位。

在C中:     int result = value& 0×03;

例如,00100101& 00000011,即00000001。

答案 2 :(得分:0)

较旧,但它是搜索结果中排名最高的搜索结果。我认为详细解释原因不会有伤害。

下面标题后的答案又快又脏

要获取特定位,一种方法是通过“位掩码”。位掩码表示您只会让某些位通过。就像当您遮住要绘画的东西时一样。

逻辑与是我们想要的指令。逻辑运算比较各个位。它是任何数字化产品(如计算机)的中央操作。当您一路下滑时,所有芯片所做的就是以新颖和创新的方式比较单个位。有2个运算和2个修饰符给出AND,OR,NOR,XOR,NAND,NOT,XNOR。

最后,我对逻辑比较器进行了总结。如果需要,请对其进行审查。 (in retrospect, I think this is the most valuable part for a newbie.)

但是,如果我们将一点设置为我们想要的东西,那么另一方面,也可以得到我们想要的东西。说我想要第2、3、4和7位。7- Y N N Y Y Y N N N-0正确。好吧,然后我创建一个带有1的蒙版。 1 0 0 1 1 1 0 0 0并进行逻辑与。

因此,这只是简单的数学运算。计算机说二进制。我只给它0 0 0 1 1 1 0 0对应的数字。

以二进制计数。最右边= 1,然后我们在每个位置加倍。我们也从0开始计数。因此,右边的第0位= 1,第一个位是2,第3位= 4,然后是8、16、32、64、128。如果需要,可以使用此数字,但请使用此数字您可以获得0到255之间的任何值。(或127到-128之间),但负数更为复杂。可能是相关的。

请务必注意,计算机语言中有两种整数类型-带符号无符号。最后一位-第7位(即您或我的第8位,价值128个无符号整数,但它等于有符号整数中的符号。令人惊讶的是,它们都具有相同的数字位数(或者也许一想到就不足为奇了

例如,让我们以给定的数字[0 0 0 1 1 1 0 0]并使第一位为1 {1 0 0 1 1 1 0 0}。如果这是一个无符号整数,则其值156(128 + 16+ 8+ 4),但如果第7位是符号位-计算起来有些复杂,您必须使用("Two's complement")来获得1001110的值。虽然它具有令人着迷的历史值得讨论,但这里不行。是通过翻转每一位来计算的-因为在负数中-0现在算作1,而1则算作0。因此,让我们使用{1 0 0 1 1 1 0 0}并使其成为一种格式-{0 1 1 0 0 0 1 1},我们只需要记住它的负数,翻转并加1:-1 + (64) + (32) + (2) + (1) = 99(-),然后我们必须记住要减去-99 - 1 = -100

我们减去一个是因为0000 0000为0。如果我们叫1111 1111 = 0,那么我们将有2个值等于0! (顺便说一下,这称为一个人的补语)。因此,第-1行中的下一个数字。我相信最好有两个关于恭维的讨论,这不在本文讨论范围之内。

所以你说, 值AND 28 = newValue 那么你可以做到这一点。

或执行FOR循环

for x in [0,1,2,4,8,16,32,64,-128]
    if (x AND value!= 0){
         y = log2(abs(x))
         print("the bit is a one in position" + y)
    } else {
        print("the bit is a 0 in position" + y)

    }

或者使用power方面进行遍历。

for(i = 1; i < 18, i++){
    byte y = 2 ** n
    if ((value & ubyte) == 0) { //is 0}

或这个基本相同的java示例:

class BitDemo {
    public static void main(String[] args) {
        int bitmask = 0x000F;
        int val = 0x2222;
        // prints "2"
        System.out.println(val & bitmask);
    }
}

快速解答在这里

由于这是一个有4年历史的问题,因此我旨在针对所有编程语言更普遍地回答该问题。在组装中,您需要发挥更大的创造力。如您所知,自您提出要求以来,每个操作都必须是离散的。真的迫使您思考。

li $t1, 0x020    # get the sixth bit, HEX 20 = DEC 32  in binary = 0b0010 0000
and $t2, $a0, $t1  #t1 gets the bit
slt $t3, $zero, $t2  # compares zero < t2 and if true stores
                       #1 into t3, so stores the 6th bit in its own register. 

使用slt,它是一条op指令,所有其他比较器都是伪指令,效率较低。更优雅。

您还可以将前两个指令与 psuedoinstruction 结合使用 **andi** $t2, $a0, 0x02但是编译器只会在后台将其转换为以上代码。我想保存一个寄存器。

另一种选择,如果您知道要查找的位,则将其移位直到其位0。

srl $v0, $t2, 5 # since we went after the 6th bit

我不喜欢使用andi(和立即方法,但是我不记得为什么。过去我有一些奇怪的行为,但是解决上述问题的最短方法是

 #your value = $a0
 andi $v0,  $a0,  0x01     #already in first bit, no more work
 andi $v1,  $a0,  0x02    
 slr  $v1,  $v1, 1         #since we have 1 bit in 2nd bit, just shift one

在您的情况下,您需要最后两位,所以我们做1 + 2(位值)=3。这就是上面的答案为0x03的地方。 0x告诉汇编程序其十六进制bc汇编程序仅真正喜欢十六进制。如果要达到良好的效果(MARS),则需要十进制3。

---逻辑比较器审阅/介绍--- 有人告诉我我是个聪明人。但是当我开始的时候,所有这些对我来说真的很混乱,很难记住。直到我看了一会儿才意识到。
实际上非常简单。现在,我看着它,然后想,为什么这么难。比一年级的1 +1更容易。因此,如果您正在阅读此想法,那么这个人为什么要解释,这是因为您不记得第一次看到它了。

这样想,要容易得多,只需记住2个选择和2个操作,它们非常容易记住- AND OR (或两者都不选)进行逻辑比较。他们不是对立的,他们是不同的,并且按照他们说的做。然后有2个修饰符。而已。以AND和OR为名,了解形容词非常容易。

  • 不是 我们谈论的第一个是最简单的。它是一个修饰符,而不是一个运算符,它只需要一个值,因此它不是像 OR AND 这样的逻辑比较器。相反。如果为1,则表示0。如果为0,则为1。相反,什么也没有。在电路中,它将是电线。没有什么变化。如果仅取1值,它是如何工作的,我认为它是紧随其后的。您执行 OR AND 操作,然后翻转它。所以 AND OR

AND OR 很简单

  • AND -如果两个都是1(1 AND 1),则值是1。这里没有别的。 1 AND 0为FALSE。 0和0为FALSE。仅当您出现工作时,您才能获得报酬。 FALSE和FALSE在该语句中不起作用。

  • OR 说,如果其中一个为1,则值为1。就这样。把书拿回来给我 OR 付我20美元,我不会打败你。您可以做一个或另一个。如果两者都做怎么办?这很重要。好吧,您不会被殴打,因此1 OR 1的值是 TRUE 。如果您不带书或带20美元,则“不被殴打” = FALSE。

  • * X ***** [...] 现在,OR的最后一部分是重要的部分。 1 OR 1 = 1位,即您可以带来20美元或返还书的情况。因此,让我们进行逻辑比较,看看什么是好主意。两者都做是愚蠢的。这就是 X 出现的地方- X 用于e X 包含在内。说真的它消除了 OR 中的一种特殊情况,其中如果A或B为1,则 OR 为true。X说,不要使用1/1 = true选项,我想要独占1个值。这就是很多人感到困惑的地方,或者至少是 是真的, XOR 说的完全是 1位为真。所以现在1 XOR 1 (=)0。

就是这些,您就拥有了所有的选择。

  • -它不是真正的比较器,只是将1个输入取反,但通常会混入
  • AND -两个比较值均为true,没有别的。
  • NAND -倒置了 AND ,因此,如果两个都为true,则为false,其他所有条件为true-(0,1)( 0,0)(1,)。
  • OR -至少一个是true(1,0)(1,1)(0,1)= True (0,0)为假
  • NOR -反转OR,因此从上面开始,(1,0)(1,1)(0,1)= False,而(0,0)是真的。
  • XOR -消除OR中的特殊情况(1,1)= true。 X仅在 OR 上起作用,现在说正好为1。
    • XNOR -这会伤到你的头。但是,只需使用真值表逐步进行操作即可。我们从 OR 开始,并删除(1,1)= true,因此当这些位匹配= false时,以及当它们不同时,它们的真(1,0)(0,1)。然后将其反转。所以现在,当位不同(1,0)(0,1)时为假。但是当他们匹配时是真的。 (1,1)和(0,0),所以这是一个 AND 门,和一个反向的 AND NAND < / strong>)门,并通过 OR / XOR 门连接。 (X无关紧要,因为除非我们正在谈论量子问题,否则您不能使两个位同时为1,1和0,0。