Получите часть номера - PullRequest
       92

Получите часть номера

0 голосов
/ 14 октября 2018

Мне дано число n, а затем n пары типа: a и i, где a представляет число, а i представляет позицию бита (из числаa), который я должен найти.

Вот что я пытался:

#include <iostream>

using namespace std;

int main()
{
    long long n,i,a,b;
    cin>>n;
    for (; n; n--) {
        cin>>a>>i;
        b = (1<<i);
        if ((a&b) != 0) cout<<1<<'\n';
        else cout<<0<<'\n';
    }
    return 0;
}

Это работает, но я получаю только 60 баллов из 100. На сайте написано вкрасный, что a является 64-разрядным целым числом со знаком, поэтому я использовал long long, а i - натуральное число, 0 <= i <= 63

Кто-нибудь знает, в чем проблема?

1 Ответ

0 голосов
/ 14 октября 2018

b - натуральное число, 0 <= <code>b <= 63 </p>

Возможно, вы имеете в виду 0 <= i <= 63?В этом случае проблема заключается в этой строке </p>

b = (1<<i);

1 - целочисленный литерал типа int, поэтому, если i> 31, тогда 1 << i вызывает UB и не даст вам 64-битное значение, как ожидалось.Вам необходимо

b = 1ULL << i

Суффикс U предназначен для беззнакового знака, который позволяет избежать UB, когда 1 сдвигается в знаковый бит, а LL для long long

Дубликаты:

...