特定情况下 计算方便,速度快
比如网络地址的计算,
IP1: 192.168.0.11
IP2: 192.168.0.51
mask: 255.255.255.0
数据分别用了4个字节来表示,当你想计算子网地址的时候就用 “MASK 逻辑或 IP” 运算, 得出 IP1 和 IP2 属于同一个子网,
当你想算这两个地址自身的时候,就用 逻辑与 运算,
如果用算数方法 速度慢 逻辑复杂
而且在单片机的情况下,有的复杂算数指令不一定支持的很好,但是位运算,就是基本逻辑运算,是99.9999% 的芯片都支持的
贴近硬件的编程时用的多,比如说单片机之类。
打个比方,如果你要用程序控制几个灯泡的亮与灭,可以使用位运算,1亮0灭。
10101010=亮灭亮灭亮灭亮灭。想让最后一个灯亮,那用位运算将该位--》置1(就是和1做“或运算”),就变成了10101011亮灭亮灭亮灭亮亮。
我只是形象的比喻了一下,一般没这么简单的。
C语言中的位运算在编程中有什么意义啊!
C语言,哪有什么“位运算”啊!
C语言的运算,都是一个 char 或 int 的。
所谓的“位运算符”,都是对“字节、字、双字”操作的。
C语言,根本就没有针对一个 bit 的运算。
去看看 C51 吧,51 单片机中,才有“位操作”的功能。
一、位运算符c语言提供了六种位运算符:
&按位与
|按位或
^按位异或
~取反
<<左移
>>右移
1.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下:00001001(9的二进制补码)&00000101(5的二进制补码)00000001(1的二进制补码)可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a&255运算(255的二进制数为0000000011111111)。
main(){
inta=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2.按位或运算按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下:00001001|00000101
00001101(十进制为13)可见9|5=13
main(){
inta=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3.按位异或运算按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^0000010100001100(十进制为12)
main(){
inta=9;
a=a^15;
printf("a=%d\n",a);
}
4.求反运算求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。例如~9的运算为:~(0000000000001001)结果为:1111111111110110
5.左移运算左移运算符“<<”是双目运算符。其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。例如:a<<4指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6.右移运算右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设a=15,a>>2表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。turboc和很多系统规定为补1。
main(){
unsigneda,b;
printf("inputanumber:");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
chara='a',b='b';
intp,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
当你用到了就知道是做什么的了。
现在不好说!