【发布时间】:2020-04-27 18:00:31
【问题描述】:
指定了一个 3 字节的数组。计算任何一个后有一个零的字节数。即最重要的1 下方的位并非都是1。
{00000100, 00000011, 00001000} - 对于这个数组,答案是 2。
我的代码给出了 1,但它不正确;如何解决?
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int res = 0, res1 = 0;
_int8 arr[3] = { 4, 3, 8 };
__asm {
mov ecx, 3
mov esi, 0
start_outer:
mov bx, 8
mov al, arr[esi]
start_inner :
shl al, 1
jnb zero
jc one
one :
dec bx к
test bx, bx
jnz start_inner
jmp end_
zero :
dec bx
test bx, bx
jz end_
inc res
shl al, 1
jnb was_zero
jc start_inner
was_zero :
dec bx
dec res
jmp start_inner
end_ :
inc esi
loop start_outer
}
cout << res << endl;
system("pause");
}
【问题讨论】:
-
"计算一个后面的零的个数" 哪个1?为什么预期的答案是 2?
-
答案是 2,因为在数组
(00000100, 00000011, 00001000)中,第一项00000100在一个后至少有一个零,00000011在一个后有 0 个零,00001000有, 再一次, 至少在一个 1 之后有一个 0。 -
@zx485 这是一种可能性,而且是有道理的,但它并不能真正与问题中的描述相提并论。
-
@Michael 是的,这就是你的想法不正确的原因。我需要计算 1 之后的所有零。zx485 解释得很好,程序应该如何计算。
-
根据附加信息,您想从计数中排除的值似乎是
(2^N)-1表单上的所有值,其中 N=0..8。您应该能够相当有效地检查这一点(例如if ((value & (value + 1)) == 0))。
标签: c++ assembly visual-c++ x86 masm