Assembly C中的按位運(yùn)算

2018-10-28 10:49 更新
不同于某些高級(jí)語言的是,C提供了按位操作的運(yùn)算符。AND運(yùn)算符用二元運(yùn)算符&來描述。OR運(yùn)算符用二元運(yùn)算符|來描述。而NOT運(yùn)算符是用一元運(yùn)算符~ 來描述。


C中的二元運(yùn)算符<<和>>執(zhí)行移位操作。運(yùn)算符<<執(zhí)行左移操作而運(yùn)算符>>執(zhí)行右移操作。這些運(yùn)算符有兩個(gè)操作數(shù)。左邊的操作數(shù)是需要移位的數(shù)值,右邊的操作數(shù)是需要移的位數(shù)。如果需要移位的數(shù)值是無符號(hào)類

型,那么就執(zhí)行了一次邏輯移位。如果需要移位的數(shù)值是有符號(hào)類型(比如:int),那么就執(zhí)行了一次算術(shù)移位。下面是一些使用了這些運(yùn)算符的C代碼例子:


C代碼例子


在C中使用按位運(yùn)算的目的與在匯編語言中使用按位運(yùn)算的目的是一樣的。它們可以允許你操作數(shù)據(jù)的單個(gè)比特位,而且可以用在快速乘除法中。事實(shí)上,一個(gè)好的C編譯器應(yīng)該可以自動(dòng)用移位來進(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è)宏來做這件事(看表3.6)。chmod函數(shù)可以用來設(shè)置文件的權(quán)限。這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是表示需設(shè)置的文件文件名的字符串,另外一個(gè)是為需要的權(quán)限設(shè)置了正確位的整形 。例如,下面的代碼設(shè)置了這樣的權(quán)限:允許文件的owner用戶對(duì)文件可讀可寫,在group中的用戶權(quán)限為可讀而others用戶沒有權(quán)限訪問。


POSIX文件權(quán)限宏

chmod("foo", S_IRUSR | S_IWUSR | S_IRGRP );


POSIX中stat函數(shù)可以用來得到文件的當(dāng)前權(quán)限位。與chmod函數(shù)一起使用,它可以用來改變某些權(quán)限而不影響到其它權(quán)限。下面是一個(gè)移除文件的others用戶的寫權(quán)限和增加owner用戶的讀權(quán)限的例子。同時(shí),其它權(quán)
限沒有被改變。


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);

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)