Что не так с моей программой? - PullRequest
1 голос
/ 20 марта 2011

Я не могу понять, что не так.Я провел несколько часов, пытаясь отладить это.Я компилирую с gcc -m32 source.c -o source

Как еще можно подойти к этому при отладке?Прямо сейчас я изолирую код разными способами, и все работает так, как я ожидаю, но работает неправильно, когда я собираю все это вместе.позиция с 1 бит.

Я сейчас удалил свой код.

Ответы [ 4 ]

3 голосов
/ 20 марта 2011

в bitsearch, вы храните num в eax, вы сохраняете специальное значение в edx для выполнения check.check проверяет, установлен ли старший бит (указывающий на отрицательное число), и завершается, если имеет место регистр ...

инструкция andl в check сохраняет результат операции внутривторой операнд (eax), поэтому результат перезаписывает num.

, затем в zero вы используете edx для выполнения вычислений ... edx содержит специальное значение началафункции, поэтому ваш результат всегда будет неправильным.

теперь в конце zero, вы возвращаетесь к check, но проверка здесь не нужна, вы должны вернуться к zero вместо ...

1 голос
/ 20 марта 2011

Есть хитрый трюк с битами: x & -x изолирует последний 1-бит.Следующая программа на C использует таблицу поиска, основанную на последовательностях де Брейна, для вычисления числа конечных (!) Нулей числа в постоянное (!) Время:

unsigned int x;  // find the number of trailing zeros in 32-bit x
int r;           // result goes here
int table[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = table[((uint32_t)((x & -x) * 0x077CB531U)) >> 27];

Это делается на языке ассемблера (который яперестал учиться к 16 годам) должно быть никаких проблем.Теперь все, что вам нужно сделать, это обратить биты в num и применить методику, описанную выше.

Я написал статью об уловке, описанной выше, но, к сожалению, ее нет в сети.Если вам интересно, я могу отправить его вам (или всем, кто заинтересован) по электронной почте.

1 голос
/ 20 марта 2011

Нужно ли осуществлять битовый поиск в сборке? Простой цикл for может выполнить ту же задачу и гораздо более читабелен:

int num = 10;
int maxFound = -1;
for (int numShifts = 0; numShifts < 32 && num != 0; numShifts++) {
    if ((num & 1) == 1) {
        maxFound = numShifts;
    }
    num = num >> 1;
}
//the last position that had a 1 will be in maxFound
0 голосов
/ 20 марта 2011

Мои знания по сборке немного ржавые, но мне кажется, что bitsearch слишком сложно.Как насчет того, чтобы просто повернуть число вправо и посчитать, сколько раз вам нужно сделать это до нуля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...