例如,我有这个二进制数: 00100101 我想创建一个新的数字,只有最后2位,其他0,如下所示: 00000001
我正在使用MIPS,所以我假设我必须使用逻辑或xor等的某种组合,但是到目前为止还没有成功。
答案 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为名,了解形容词非常容易。
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。
就是这些,您就拥有了所有的选择。