Преобразование функции C++ в C#

Я пытаюсь преобразовать функцию С++ в С#, но терплю неудачу второй час подряд. Нужна помощь:/ Функция взята из этого вопроса

bool haswon(unsigned __int64 newboard)
{
    unsigned __int64 y = newboard & (newboard >> 6);
    if (y & (y >> 2 * 6)) // check \ diagonal
        return true;
    y = newboard & (newboard >> 7);
    if (y & (y >> 2 * 7)) // check horizontal -
        return true;
    y = newboard & (newboard >> 8);
    if (y & (y >> 2 * 8)) // check / diagonal
        return true;
    y = newboard & (newboard >> 1);
    if (y & (y >> 2))     // check vertical |
        return true;
    return false;
}

Вот мой С#:

    bool HasWon(ulong newboard)
    {
        ulong y = newboard & (newboard >> 6);
        if ((y & (y >> 2 * 6)) > 0) // check \ diagonal
            return true;
        y = newboard & (newboard >> 7);
        if ((y & (y >> 2 * 7)) > 0) // check horizontal -
            return true;
        y = newboard & (newboard >> 8);
        if ((y & (y >> 2 * 7)) > 0) // check / diagonal
            return true;
        y = newboard & (newboard >> 1);
        if ((y & (y >> 2 * 7)) > 0)    // check vertical |
            return true;
        return false;
    }

Но это не работает! Вроде мелочь, но я совсем запутался. Спасибо за помощь


person Louisa Bickley    schedule 29.04.2017    source источник
comment
Сравните свой код с кодом C, вы должны увидеть свои ошибки копирования и вставки. (Подсказка: число смертных грехов...)   -  person    schedule 29.04.2017
comment
Как это не работает? (что вы вводили, каков был ваш ожидаемый результат, какая строка не возвращает то, что вы ожидаете)?   -  person Rufus L    schedule 29.04.2017
comment
@RufusL это алгоритм проверки того, подключена ли игровая доска Connect 4 (если в строке 4 бита). Здесь это подробно объясняется. В основном, если вы пройдете 15, вы должны получить истину. Потому что последние 4 бита из 15 это 1111. Но я не могу это понять :/ Я не вижу никаких смертных грехов :(   -  person Louisa Bickley    schedule 29.04.2017
comment
Да, я понимаю. Когда вы проходите код, все строки не работают? или только некоторые из них? (в последних двух строках вы не сдвигаете y вдвое больше, чем вы сдвигаете newboard )   -  person Rufus L    schedule 29.04.2017


Ответы (1)


Похоже на простую ошибку копирования/вставки. Ваши последние две строки не смещали y вдвое больше, чем newboard:

private static bool isWon(ulong board)
{
    // Check / diagonal
    ulong y = board & (board >> 8);
    if ((y & (y >> 2 * 8)) > 0) return true;

    // Check - horizontal
    y = board & (board >> 7);
    if ((y & (y >> 2 * 7)) > 0) return true;

    // Check \ diagonal
    y = board & (board >> 6);
    if ((y & (y >> 2 * 6)) > 0) return true;

    // Check | vertical
    y = board & (board >> 1);
    if ((y & (y >> 2)) > 0) return true;

    return false;
}
person Rufus L    schedule 29.04.2017
comment
МОЙ БОГ! Теперь я это вижу. Я сломал алгоритм, пока пытался его исправить :/ спасибо, ребята. Теперь я понимаю, почему были немного сбиты с толку. - person Louisa Bickley; 29.04.2017
comment
Вы также делаете ошибку копирования и обратный порядок операций;) - person Logman; 29.04.2017
comment
Да, я изменил порядок, но чеки все те же. - person Rufus L; 29.04.2017
comment
@RufusL подожди, почему ты изменил порядок? Это имеет значение? - person Louisa Bickley; 29.04.2017
comment
@RufusL Теперь я вижу, что порядок не важен - person Logman; 29.04.2017
comment
Нет, просто мой мозг хотел, чтобы они были в порядке убывания - person Rufus L; 29.04.2017