Что означают эти операторы C? - PullRequest
2 голосов
/ 04 июня 2009

Я читаю книгу «Проблемы программирования: Учебное пособие по программированию» и решаю проблему, в которой я не понимаю использования операторов c >> 1 и сравнения if (n & 1), кто-то может помочь мне знаете, что они имеют в виду?

это пример кода

#include <stdio.h>

#define MAX_N 300
#define MAX_D 150

long cache[MAX_N/2][2];

void make_cache(int n,int d,int mode)
{
    long tmp[MAX_D];
    int i,count;

    for(i=0;i<MAX_D;i++) tmp[i]=0;

    tmp[0]=1;count=0;

    while(count<=n)
    {
        count++;

        for(i=(count&1);i<=d;i+=2)
        {
            if(i)
                tmp[i] = tmp[i-1] + tmp[i+1];
            else if(!mode)
                tmp[0]=tmp[1];
            else
                tmp[0]=0;
        }

        if((count&1)==(d&1))
            cache[count>>1][mode]=tmp[d];
    }
}

int main()
{
    int n,d,i;
    long sum;

    while(1)
    {
        scanf("%d %d",&n,&d);

        if(n&1)
            sum=0;
        else if(d==1)
            sum=1;
        else if(n<(d<<1))
            sum=0;
        else if(n==(d<<1))
            sum=1;
        else
        {
            make_cache(n,d,0);
            make_cache(n,d,1);
            sum=0;

            for(i=0;i<=(n>>1);i++)
                sum+=cache[i][0]*cache[(n>>1)-i][1];
        }

        printf("%ld\n",sum);
    }

    return 0;
}

Ответы [ 8 ]

15 голосов
/ 04 июня 2009

>> сдвигает биты вправо на n битов. Итак, это:

1011 0101

сдвигается вниз 1 становится:

0101 1010

Оператор & выполняет побитовое и поэтому снова принимает:

1011 0101

& с 1 вы получите (и это означает, что оба должны быть 1, иначе это 0):

 1011 0101
&0000 0001
----------
 0000 0001

Надеюсь, это поможет ответить на ваш вопрос!

7 голосов
/ 04 июня 2009

c >> 1 - это деление на 2 (как целое число), а n & 0x1 часто используется для проверки, является ли число нечетным или нет.

здесь есть несколько статей:

http://irc.essex.ac.uk/www.iota-six.co.uk/c/e5_bitwise_shift_operators.asp

http://irc.essex.ac.uk/www.iota-six.co.uk/c/e4_bitwise_operators_and_or_xor.asp

2 голосов
/ 04 июня 2009

c>>1 сдвигает биты C на единицу вправо, что в итоге равнозначно целочисленному делению на 2 для целых чисел без знака или положительного числа. то есть 5/2 = 2 == 0101 >> 1 = 0010.

n&1 выполняет двоичное И между n и 1. if (n&1) проверяет, является ли число нечетным, поскольку нечетные числа будут иметь младший бит 1, а четные числа - нет.

Такие "хитрости" симпатичны и, в общем, имеют небольшую ценность (так как компилятор должен делать подобные трюки). Это вдвойне бесполезно в соревновании по программированию, где главная цель - найти правильное решение: такие «хитрости» помешают легко прочитать исходный код, что затруднит отладку.

2 голосов
/ 04 июня 2009

c >> 1 означает сдвиг вправо переменной c на 1 бит, что фактически равно делению ее на 2. '&' - это побитовый оператор AND, используемый для проверки, установлен конкретный бит или нет. Когда вы делаете n & 1, оно совпадает с n & 0x0001, которое проверяет, установлен или нет младший значащий бит переменной. В противном случае будет установлено значение true, если установлено значение false.

1 голос
/ 09 августа 2014

Эти операторы используются при сравнении нечетных и четных чисел.

Младший значащий бит любого нечетного числа равен единице всегда (т.е.) 010 (1)

То есть, если (Oddnumber & 1) = 1 и (evennumber & 1 = 0) по умолчанию.

1 голос
/ 04 июня 2009

Это побитовые операторы. << и >> сдвигают биты влево и вправо соответственно. '&' - это оператор AND, являющийся одним амперсандом. Когда вы И два бита, результат равен 1, если оба бита равны 1, и 0, если оба или один из битов равен 0. Хороший способ думать об этом: оба бита должны быть «установлены», чтобы они равнялись 1.

Я написал учебник по различным Бит Twiddling .

0 голосов
/ 04 июня 2009

Обратите внимание, что >> ведет себя по-разному в неподписанных типах (тип char, short, long или long long) по сравнению со знаковыми типами. В обоих случаях происходит смещение вправо, но для типов без знака все «новые» биты слева равны 0, а для типов со знаком они равны 0 или 1 в зависимости от исходного значения старшего бита. Итак, подписанный символ:

1011 0101

смещено вниз на 1 становится

1101 1010

Это делает его непротиворечивым как операция деления на степень 2; -75 / 2 = -37,5, округлено до -38.

0 голосов
/ 04 июня 2009

Как отмечалось в других ответах, это побитовые операторы. Они могут быть незнакомы, потому что они очень "близки к аппаратным" операциям. Они привязаны к тому, как компьютеры хранят числа (двоичные числа), поэтому их не учат в стандартных математических классах. Причина, по которой они сталкиваются с программистом, заключается в том, что они аппаратно работают на очень , поэтому некоторые алгоритмы могут быть значительно оптимизированы с их использованием.

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