C语言逻辑运算符的误解

3

我在自己的书中有这样一些问题,我为了检查自己而做了它们,但是我不知道正确的答案,也没有任何解释。

它分为两个部分 "a" 和 "b"。

a) A = B & C[0]
b) A = A ? B : C[0]

C[0]  = 0x00001234
A = 0x00000000
B = 0x00002222

IT需要我做什么

1)what is the result of A 
2) the MIPS instruction for each part
3)show the bit level representation of each in structure.

谢谢


'&'是位运算符,而不是逻辑运算符。B和C的起始值是什么?(它们是0x1234和0x2222吗?)你可以从中推出A... - Starkey
3个回答

3

& 是按位与运算符。输出的每个位都是1,如果相应的输入位都是1:

0x00001234 = .... 0001 0010 0011 0100
0x00002222 = .... 0010 0010 0010 0010

AND result = .... 0000 0010 0010 0000 = 0x00000220

我不了解MIPS,但是这个指令可能只是被称为and?是三元运算符:你的示例意味着“如果A是真布尔表达式,则返回B,否���返回C [0]”。通常在C中,假是零,真是非零(我不确定是否已经标准化 - 在早期标准中似乎没有,但它是常见的用法),因此:
  • 如果A = 0x0000,则(bool)A == false,并且结果为C [0]。
  • 如果A = 0x0220(从a部分向前推导结果),则(bool)A == true,并且结果为B。

1
除了最后一部分外都很好:在C和相关语言中,0x0220(或任何其他非零值)被评估为TRUE。 - Paul R
@Paul 我会将a)和b)视为两个不同的问题,因此我在问题中使用了A的初始值= 0x0000。但是,如果值保持不变,则A为真,并且b)的结果为B。 - Rup
@Rup:啊,我现在看到问题中的歧义了——我猜想(b)应该是跟随(a)并且 A = 0x0220,但正如你所说,这并不是100%清楚的。 - Paul R
我理解错了吗?十六进制转二进制很容易,因为每个十六进制数字(十进制0-15)恰好是四位二进制数,所以数字映射为0x1 = 0001,0x2 = 0010,0x3 = 0011 .. 0xf = 1111。 - Rup

2

&是C语言中的按位与运算符。例如:0000 & 0001 = 0000。

?是另一种表示if的方式。

A = A ? B : C[0]

说A得到的值为(if A为真,则B,否则C[0])

将十六进制转换为二进制并进行练习。

编辑:澄清:将“AND”更改为位运算AND


第一个问题是我需要将结果转换为十六进制吗? - user472221
如果你想执行按位与操作,那么你应该这样做。 - user418748
A=A 会检查二进制还是十六进制? - user472221
请注意,当某个值为0时,它被视为假。例如,如果A在&运算后的值为0000,则其为假,并且将获得C[0]的值。 - user418748
2
二进制和十六进制只是同一事物的不同表示方式。 - user418748
还有,什么是位级表示? - user472221

1

mips:

a) A = B & C[0]

$t1 = C

$t2 = B

$t3 = A

lw $t0, 0($t1) ;将C移入临时寄存器

and $t3, $t0, $t2 ;执行按位与操作

b) A = A ? B : C[0]

$t1 = C

$t2 = B

$t3 = A

beq $0, $t3, 3 ;如果A为0,则向下跳3行

add $t3, $0, $t2 ;将B移至A

j end ;跳转至结尾

lw $t0, 0($t1) ;将C加载至临时寄存器

add $t3, $0, $t0 ;将临时值移至A

end:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接