2015-12-02 105 views
-6

我開始使用termcap,我看到了這種操作。C中的這個操作是什麼?

term.c_lflag &= ~(ICANON);

我知道&=binary AND,我不是很舒適吧。

爲什麼不簡單地使用=或製作#define以及&= ~是做什麼的?

+0

爲什麼人們不願意? –

+1

也許是因爲您會通過搜索「c運營商」或任何C書籍,教程等來找到答案。 – Olaf

+0

我做到了!我看,我發現了一些......但我不明白爲什麼所有這些都與termcap有關! –

回答

5

假設ICANON是位掩碼,即具有設置爲代表的一些特徵比特的整數,該語句將確保那些位都在c_lflag集。

這通常被稱爲「遮蔽」這些位。 (~是按位逆)。

因此,如果的c_lflag值是3(二進制11 )的操作之前,並ICANON具有值2(二進制10 ),它將成爲1,因爲它是按位與:編帶值爲~2,它的所有位都設置爲除位號1(二進制... 11101 )。

它也可以寫得更冗餘的

term.c_lflag = term.c_lflag & ~ICANON; 

不應該需要圍繞ICANON括號。

+1

@Olaf我不是在說''',而是'〜'...... – unwind

1

你的線從term.c_lflag除去的ICANON位(多個):

假設術語頃4位長,如果ICANON值4(0100B),那麼~ICANON的值是11(1011B),等:

term.c_lflag 1 1 1 0 
AND  ~ICANON 1 0 1 1 
    --------------------- 
        1 0 1 0 

==> 1010B,10十進制

0
term.c_lflag &= ~(ICANON); 

等於

term.c_lflag = term.c_lflag & ~(ICANON); 

&和〜運營商是兩個不同的運營商。 〜不是操作符,它將每個位與其反轉換。 &運算符是按位AND運算符,在該運算符中它逐位比較操作數。

+0

這不等於。評估左值時存在細微的差異。 – Olaf

相關問題