Assembly C中的按位运算
C中的二元运算符<<和>>执行移位操作。运算符<<执行左移操作而运算符>>执行右移操作。这些运算符有两个操作数。左边的操作数是需要移位的数值,右边的操作数是需要移的位数。如果需要移位的数值是无符号类
型,那么就执行了一次逻辑移位。如果需要移位的数值是有符号类型(比如:int),那么就执行了一次算术移位。下面是一些使用了这些运算符的C代码例子:
在C中使用按位运算的目的与在汇编语言中使用按位运算的目的是一样的。它们可以允许你操作数据的单个比特位,而且可以用在快速乘除法中。事实上,一个好的C编译器应该可以自动用移位来进行乘法运算如:x*= 2。
许多操作系统的API(例如:POSIX和Win32)包含了一些函数,这些函数使用的操作数含有按位编码的数据。例如:POSIX系统就为三种不同类型的用户保留了文件的权限:user (用户,owner可能是一个更好的名字),group(组用户)和others(其它用户)。每一种类型的用户可以被授予进行读,写和/或执行一个文件的权限。要改变一个文件的权限,要求C程序员进行单个的位操作。POSIX定义了几个宏来做这件事(看表3.6)。chmod函数可以用来设置文件的权限。这个函数有两个参数,一个是表示需设置的文件文件名的字符串,另外一个是为需要的权限设置了正确位的整形 。例如,下面的代码设置了这样的权限:允许文件的owner用户对文件可读可写,在group中的用户权限为可读而others用户没有权限访问。
POSIX中stat函数可以用来得到文件的当前权限位。与chmod函数一起使用,它可以用来改变某些权限而不影响到其它权限。下面是一个移除文件的others用户的写权限和增加owner用户的读权限的例子。同时,其它权
限没有被改变。
1 struct stat file_stats ; /* stat()使用的结构体*/
2 stat ("foo", & file stats ); /* 读文件信息¯le stats.st mode中有权限位*/
3 chmod("foo", ( file stats .st_mode & ~S_IWOTH) | S_IRUSR);