You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出多数值的共同位模式?位标志程序返回值疑问

问题描述

编写一个使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:20:06