c语言按位运算设置和取消设置
如果state0x8000的值为0,那么state0x8000?1:0的结果是0,否则是1。
State0x8000是按位AND运算。AND运算是把两个数都转换成二进制数,然后依次比较对应的位。如果相应的位都是1,则AND运算的结果是1。如果不存在相应的位都是1的情况,则AND运算的结果是0。
0x8000是一个十六进制数,转换成二进制是1000 0000 0000 0000,然后和state的值按位and。这里,如果state的值也是0x8000,那么这个AND运算的结果是1,否则AND运算的结果是0。
c语言位操作 位置运算符
c提供了六个按位运算符;这些运算符可能只允许整数操作数,即char、short、int和long,无论有符号还是无符号。
按位AND
|
按位或
^
按位异或
左移
右移
~
反转(一元运算)
按位AND运算通常用于屏蔽某些位,例如
n
=
n
0177;
使得n中除了低7位之外的所有位都是0。
按位或运算|用于打开某些位:
x
=
x
|
SET _ ON
使得某个SET_ON和x的相反位变成1。
按位异或运算使两个操作数的位在不同时设为1,在相同时设为0。
应该将位运算符|与逻辑运算符||(从左到右计算真值)区分开来。例如,如果x是1,y是2,那么x
y是0,而x
y是1。
移位运算符将左操作数或右操作数移位给定的数字,并且右操作数必须为非负。所以x
2.将x的值左移两位,用0填充空位;这相当于乘以4。将一个无符号数向右移动会用0填充它。将一个有符号的数向右移位,在一些机器上用符号位填充(“算术移位”),在另一些机器上用0填充(“逻辑移位”)。
单目算子~求一个整数的反;即1的每一位都变成0,反之亦然。例如
x
=
x
~077
将x的最后六个位置设置为0。注意x
~077的值取决于字长,所以比如假设X是16位,就是X。
0177700。这种简单的形式不会造成额外的开销,因为~077是一个常量表达式,可以在编译阶段计算出来。
作为使用位操作的一个例子,考虑函数getbits(x,p,n)。它返回一个从p位置开始的n位x值。我们假设0位在最右边,n和p都是正数。例如,getbits(x,4,3)返回右边的位4、3和2。
/*
getbits:
返回从位置p开始的n位。
*/
无符号的
getbits(无符号
x,
(同Internationalorganizations)国际组织
p,
(同Internationalorganizations)国际组织
n)
{
返回
(十
(第n页)
~(~0
n);
}
表达式x
(p n)将必填字段移至单词右侧。~0全是1;向左移动n,最右边填0;使用~使最右边的n ^ 1成为遮罩。
如何在c语言中操作按位运算符!? 位运算
在许多系统程序中,经常需要在比特级执行操作或处理。c语言提供了位运算的功能,
这使得C语言也可以像汇编语言一样用来编写系统程序。
首先,位操作符C语言提供了六个位操作符:
按位and
|
按位或
^
按位异或
~
收回
左移
右移
1.
按位AND运算
按位AND运算符“”是一个双目运算符。它的作用是参与运算两个数对应的二进制和。当相应的两位都为1时,结果位仅为1。
,否则为0。运算中涉及的数以补数的形式出现。
例如,95可以写成如下形式:
00001001
(9的二进制补码)00000101
(5的二进制补码)
00000001
(1的2的补数)表明95=1。
按位AND运算通常用于清除某些位或保留某些位。例如,一个
高八位清零
,
保留低八位,
左克
a255
计算
(
255
的二进制数是00000001111111)。
main(){
(同Internationalorganizations)国际组织
a=9,b=5,c;
c = ab
printf("a=%d\nb=%d\nc=%d\n ",a,b,c);
}
2.
按位或运算
按位OR运算符“|”是一个双目运算符。它的功能是参与运算的两个数的二进制或。只要对应的两个二进制中有一个是1,结果位就是1。运算中涉及的两个数字都是互补的。
例如:9|5可以这样写:
00001001|00000101
00001101
(十进制13)9 | 5 = 13可见。
main(){
(同Internationalorganizations)国际组织
a=9,b=5,c;
c = a | b;
printf("a=%d\nb=%d\nc=%d\n ",a,b,c);
}
3.
逐位异或运算
按位异或运算符“”是一种双目运算符。它的作用是参与运算的两个数对应的二进制不同或,当对应的两个二进制不同时,结果为1。参与操作数仍然作为补码出现。例如,9 ^ 5可以写成以下公式:
00001001^00000101
00001100
(十进制12)
main(){
(同Internationalorganizations)国际组织
a = 9;
a=a^15;
printf("a=%d\n ",a);
}
4.
逆向操作
否定算子~是右组合的单目算子。
它的功能是对运算中涉及的每个二进制数进行逐位求反。例如~ 9的运算是:
~(0000000000001001)结果是:11111111110110。
5.
左移操作
左移运算符“”是双目运算符。它的功能把“
左边操作数的所有位都左移若干位,要移动的位数由“”右边的数字指定。
高位被丢弃,低位用0填充。例如:
a4
指将A的每个二进制数左移4位。比如a=00000011(十进制3),左移四位后就是00110000(十进制48)。6.
右移位操作右移位操作符“”是双目操作符。它的功能是把“
左边操作数的所有位都向右移动几位,右边的数字指定要移动的位数。
例如:设置
a=15,a2
表示将000001111右移至00000011(十进制3)。应该注意,对于有符号的数字,当向右移动时,符号位将随之移动。当它是正数时,
最高位为0,为负时,符号位为1,最高位为0或1。
这取决于编译系统的规则。涡轮
c和许多制度都规定为补充1。
main(){
无符号的
甲、乙;
printf("输入
a
编号:
");
scanf("%d ",a);
b = a5
b = b15
printf("a=%d\tb=%d\n ",a,b);
}
请看另一个例子!
main(){
茶
a='a ',b = ' b
(同Internationalorganizations)国际组织
p,c,d;
p = a;
p =(P8)| b;
d = p0xff
c =(p0xff 00)8;
printf(" a = % d \ nb = % d \ NC = % d \ nd = % d \ n ",a,b,c,d);
}
最后更新于 2023-10-08 04:22:19 并被添加「」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章