C中的二元運(yùn)算符<<和>>執(zhí)行移位操作。運(yùn)算符<<執(zhí)行左移操作而運(yùn)算符>>執(zhí)行右移操作。這些運(yùn)算符有兩個(gè)操作數(shù)。左邊的操作數(shù)是需要移位的數(shù)值,右邊的操作數(shù)是需要移的位數(shù)。如果需要移位的數(shù)值是無(wú)符號(hào)類
型,那么就執(zhí)行了一次邏輯移位。如果需要移位的數(shù)值是有符號(hào)類型(比如:int),那么就執(zhí)行了一次算術(shù)移位。下面是一些使用了這些運(yùn)算符的C代碼例子:
在C中使用按位運(yùn)算的目的與在匯編語(yǔ)言中使用按位運(yùn)算的目的是一樣的。它們可以允許你操作數(shù)據(jù)的單個(gè)比特位,而且可以用在快速乘除法中。事實(shí)上,一個(gè)好的C編譯器應(yīng)該可以自動(dòng)用移位來(lái)進(jìn)行乘法運(yùn)算如:x*= 2。
許多操作系統(tǒng)的API(例如:POSIX和Win32)包含了一些函數(shù),這些函數(shù)使用的操作數(shù)含有按位編碼的數(shù)據(jù)。例如:POSIX系統(tǒng)就為三種不同類型的用戶保留了文件的權(quán)限:user (用戶,owner可能是一個(gè)更好的名字),group(組用戶)和others(其它用戶)。每一種類型的用戶可以被授予進(jìn)行讀,寫和/或執(zhí)行一個(gè)文件的權(quán)限。要改變一個(gè)文件的權(quán)限,要求C程序員進(jìn)行單個(gè)的位操作。POSIX定義了幾個(gè)宏來(lái)做這件事(看表3.6)。chmod函數(shù)可以用來(lái)設(shè)置文件的權(quán)限。這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是表示需設(shè)置的文件文件名的字符串,另外一個(gè)是為需要的權(quán)限設(shè)置了正確位的整形 。例如,下面的代碼設(shè)置了這樣的權(quán)限:允許文件的owner用戶對(duì)文件可讀可寫,在group中的用戶權(quán)限為可讀而others用戶沒(méi)有權(quán)限訪問(wèn)。
POSIX中stat函數(shù)可以用來(lái)得到文件的當(dāng)前權(quán)限位。與chmod函數(shù)一起使用,它可以用來(lái)改變某些權(quán)限而不影響到其它權(quán)限。下面是一個(gè)移除文件的others用戶的寫權(quán)限和增加owner用戶的讀權(quán)限的例子。同時(shí),其它權(quán)
限沒(méi)有被改變。
1 struct stat file_stats ; /* stat()使用的結(jié)構(gòu)體*/
2 stat ("foo", & file stats ); /* 讀文件信息ˉle stats.st mode中有權(quán)限位*/
3 chmod("foo", ( file stats .st_mode & ~S_IWOTH) | S_IRUSR);
更多建議: