[英]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&1
在n
和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.