C语言学习笔记(十七)
admin
2024-03-08 19:05:38

C语言学习第十七天

2.9 按位运算符

C语言提供了6个位操作运算符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号的char、short、int与long类型:

    &   按位与(AND)
    |    按位或(OR)
    ^   按位异或(XOR)
    <<  左移
    >>  右移
    ~  按位求反(一元运算符)

按位与运算符&经常用于屏蔽某些二进制位,例如:

    n = n & 0177;

该语句将n中除7个低二进制位外的其他各位均置为0.

按位或运算符|常用于将某些二进制位置为1,例如:

    x = x | SET_ON;

该语句将x中对应与SET_ON中为1的那些二进制位置为1.

按位异或运算符^当两个操作数的对于位不相同时,将该位设置为1,否则,将该位设置为0.

我们必须将位运算符&、|同逻辑运算符&&、||区分开来,后者用于从左至右求表达式的真值。例如,如果x的值为1, y的值为2,那么,x&y的结果为0,而x&&y的值为1.

移位运算符<<与>>分别用于将运算的左操作数左移与右移,移位的位数则由右操作数指定(右操作数的值必须时非负值)。因此,表达式x<<2将把x的值左移2位,右边空出的2位用0填补,该表达式等价于对左操作数乘以4。在对unsigned类型的无符号值进行右移位时,左边空出的部分将用0填补;当对signed类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。

一元运算符~用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1.

例如:
    x = x & ~077

将把x的最后6位设置为0。
为了进一步说明某些位运算符,来看函数getbits(x, p, n) ,它返回x中从右边数第p位开始向右数n位的字段。这里假定最右边的一为时第0位,n与p都是合理的正值。例如,getbits(x, 4, 3)返回x中第4、3、2三位的值。

/* getbits函数: 返回x中从第p位开始的n位 */
unsigned getbits(unsigned x, int p, int n){
    return (x >> (p+1-n)) & ~(~0 << n);
}

其中,表达式x>>(p+1-n)将期望获得的字段移位到字的最右端。~0的所有位都为1,这里使用语句~0<

练习2-6 编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边的n位的值,x的其余各位保持不变。
练习2-7 编写一个函数invert(x, p, n),该函数返回对x执行下列操作后的结果值:将x中从第p为开始的n个(二进制)位求反(即,1变成0,0变成1),x的其余各位保持不变。
练习2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位从最左端移入)n(二进制)位后所得到的值。

相关内容

热门资讯

驶入阿拉木图:满街的中国品牌,... “一到阿拉木图,很快就能看到很多中国品牌,从汽车品牌,到家电、电子产品、手机品牌等等。”Yandex...
当“绣花精神”遇见AI:数字绣... 文/羊城晚报全媒体记者 程行欢 汪海晏 董鹏程图/唐德荣 陈明谦 潘嘉焌从一针一线的精细功夫,到算法...
特朗普个人投资组合新增价值5,... 格隆汇1月16日|截至去年12月,美国总统特朗普对市政债和企业债的投资中,包含了部分受其政府政策影响...
也门政府任命新任总理 当地时间1月16日凌晨,也门总统领导委员会主席拉沙德·穆罕默德·阿里米发布决定,任命沙伊·穆赫辛·赞...
高质量建设国家生态文明试验区   习近平总书记强调:“持续抓好突出环境问题整治,高质量建设国家生态文明试验区。”建设国家生态文明试...