簡體   English   中英

這些C運算符是什么意思?

[英]What do these C operators mean?

我正在閱讀“編程挑戰:編程競賽培訓手冊”一書,正在實現一個問題,我不理解運算符的使用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;
}

>>將位移位到右n位。 所以這:

1011 0101

向下移1成為:

0101 1010

&運算符按位進行,所以再次采取:

1011 0101

&得到1(並且意味着兩者必須是1,否則它是0):

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

希望這有助於回答您的問題!

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

c >> 1表示將變量c右移1位,實際上與將其除以2相同。'&'是用於測試特定位是否置位的按位AND運算符。 當你執行n&1時,它與n&0x0001相同,它檢查變量的最低有效位是否設置。 如果設置為false,則結果為true。

c>>1將C中的位移位到“右”,最后與無符號或正整數的整數除2相同。 即5/2 = 2 == 0101 >> 1 = 0010。

n&1n和1之間執行二進制AND。 if (n&1)檢查數字是否為奇數,因為奇數將具有1的LSB而偶數不具有偶數。

這樣的“技巧”很可愛,一般來說價值不大(因為編譯器應該做這些技巧)。 在編程競賽中它是無用的,其中最重要的目標是產生正確的解決方案:這樣的“技巧”只會妨礙易於閱讀的源代碼,從而使調試更加困難。

這些運算符用於比較奇數和偶數。

任何奇數的最低有效位是一個總是(即) 010(1)

因此,默認情況下,(Oddnumber&1)= 1和(偶數&1 = 0)。

那些是按位運算符。 <<和>>分別左右移位。 '&'是AND運算符是單個&符號。 當你和兩位時,如果兩個位都是1,則結果為1;如果兩個位中的任何一個為0,則結果為0.考慮它的一個好方法是必須將這兩個位“設置”為等於1。

我寫了一篇關於各種Bit Twiddling的教程。

如其他答案所述,這些是按位運算符。 他們可能不熟悉,因為他們非常“接近硬件”操作。 它們與計算機存儲數字(二進制​​)的特定方式聯系在一起,這就是為什么它們不是在標准數學類中教授的原因。 他們接觸程序員的原因是他們的硬件速度非常快,因此可以根據使用情況對某些算法進行大幅優化。

請注意,>>對無符號類型(無論是char,short,long還是long long)的行為與簽名類型的行為不同。 在這兩種情況下,它都是右移,但對於無符號類型,左邊的“新”位都是0,而對於有符號類型,它們是0或1,具體取決於原始的高位值。 一個簽名的角色:

1011 0101

向下移動1變為

1101 1010

這使得它作為2次冪分割操作是一致的; -75 / 2 = -37.5,向下舍入到-38。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM