如何找出多数值的共同位模式?位标志程序返回值疑问
问题描述
编写一个使用bit flags的程序,接收三个不同的值,找出它们共有的位,返回包含所有这些共有位的数值。
flag bit是为某个位分配的名称,例如在.equ KNOWS_MATHS, 0b1中,最低位被命名为KNOWS_MATHS。
我写了下面的代码,但不确定应该返回数值1(因为它的位模式最普遍)还是数值7(因为它包含的位最多),英语不是我的母语,对需求的理解不太清晰。
我的代码
.data .equ KNOWS_MATHS, 0b1 .equ KNOWS_PHYSICS, 0b10 .equ KNOWS_CHEMISTRY, 0b100 numbers: .quad 1, 3, 7 # 3 = 11b, 7 = 111b results: .quad 0, 0, 0 .text .global main main: movq %rsp, %rbp #for correct debugging # check if first num knows maths leaq numbers, %rbx movq (%rbx), %rax andq $KNOWS_MATHS, %rax jnz knowsmaths flag2: movq (%rbx), %rax andq $KNOWS_PHYSICS, %rax jnz knowsphysics flag3: movq (%rbx), %rax andq $KNOWS_CHEMISTRY, %rax jnz knowschemistry jmp number02 knowsmaths: incq results jmp flag2 knowsphysics: incq results jmp flag3 knowschemistry: incq results number02: leaq results, %rdx leaq numbers, %rbx movq 8(%rbx), %rax andq $KNOWS_MATHS, %rax jnz knowsmaths02 flag4: movq 8(%rbx), %rax andq $KNOWS_PHYSICS, %rax jnz knowsphysics02 flag5: movq 8(%rbx), %rax andq $KNOWS_CHEMISTRY, %rax jnz knowschemistry02 jmp number03 knowsmaths02: incq 8(%rdx) jmp flag4 knowsphysics02: incq 8(%rdx) jmp flag5 knowschemistry02: incq 8(%rdx) number03: leaq results, %rdx leaq numbers, %rbx movq 16(%rbx), %rax andq $KNOWS_MATHS, %rax jnz knowsmaths03 flag6: movq 16(%rbx), %rax andq $KNOWS_PHYSICS, %rax jnz knowsphysics03 flag7: movq 16(%rbx), %rax andq $KNOWS_CHEMISTRY, %rax jnz knowschemistry03 jmp finish knowsmaths03: incq 16(%rdx) jmp flag6 knowsphysics03: incq 16(%rdx) jmp flag7 knowschemistry03: incq 16(%rdx) finish: movq $results, %rbx movq (%rbx), %r8 movq 8(%rbx), %r9 movq 16(%rbx), %r10 movq $60, %rax syscall
需求理解与正确返回值
需求里的“找出它们共有的位”,指的是三个数值中每一个都设置了的位,也就是对三个数依次执行按位与操作的结果。
看你给出的输入数值:
- 1 = 0b001
- 3 = 0b011
- 7 = 0b111
三个数按位与的结果是 0b001,也就是数值1。因为只有最低位(对应KNOWS_MATHS)在三个数里都被设置了,其他位在第一个数中是0,不属于“共有位”范畴。
数值7包含所有位,但它不是三个数共有的——第一个数没有物理和化学对应的位,所以7不符合需求要求。
你的当前代码逻辑是统计每个数包含的标志数量,这和需求不符。正确的简化逻辑可以是直接对三个数做按位与:
# 示例核心逻辑 movq numbers(%rip), %rax # 取第一个数1 andq numbers+8(%rip), %rax # 和第二个数3按位与,结果为1 andq numbers+16(%rip), %rax# 和第三个数7按位与,结果仍为1 movq %rax, %rdi # 将结果作为程序返回值 movq $60, %rax syscall
内容的提问来源于stack exchange,提问作者ntos
相关产品推荐
相关产品推荐

