本文目录一览:
c语言位运算是什么?
运算:C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。
在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。
当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则就会显得十分重要。
运算符号:
比较特别的是,比特右移()运算符可以是算术(左端补最高有效位)或是逻辑(左端补0)位移。
例如,将11100011右移3比特,算术右移后成为11111100,逻辑右移则为00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。
运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。
c语言的按位运算符怎么操作!?
位运算
在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,
这使得C语言也能像汇编语言一样用来编写系统程序。
一、位运算符C语言提供了六种位运算符:
按位与
|
按位或
^
按位异或
~
取反
左移
右移
1.
按位与运算
按位与运算符""是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1
,否则为0。参与运算的数以补码方式出现。
例如:95可写算式如下:
00001001
(9的二进制补码)00000101
(5的二进制补码)
00000001
(1的二进制补码)可见95=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a
的高八位清
,
保留低八位,
可作
a255
运算
(
255
的二进制数为0000000011111111)。
main(){
int
a=9,b=5,c;
c=ab;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2.
按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下:
00001001|00000101
00001101
(十进制为13)可见9|5=13
main(){
int
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(){
int
a=9;
a=a^15;
printf("a=%d\n",a);
}
4.
求反运算
求反运算符~为单目运算符,具有右结合性。
其功能是对参与运算的数的各二进位按位求反。例如~9的运算为:
~(0000000000001001)结果为:1111111111110110
5.
左移运算
左移运算符“”是双目运算符。其功能把“
”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,
高位丢弃,低位补0。例如:
a4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6.
右移运算右移运算符“”是双目运算符。其功能是把“
”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。
例如:设
a=15,a2
表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,
最高位补0,而为负数时,符号位为1,最高位是补0或是补1
取决于编译系统的规定。Turbo
C和很多系统规定为补1。
main(){
unsigned
a,b;
printf("input
a
number:
");
scanf("%d",a);
b=a5;
b=b15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
char
a='a',b='b';
int
p,c,d;
p=a;
p=(p8)|b;
d=p0xff;
c=(p0xff00)8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
c语言之中的位运算符是怎么运算的呢?
所谓位,就是指将一个或两个数转换成二进制按每一位进行运算
位与
运算规则
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1
|位或
运算规则
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
^异或
运算规则
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
~取反
运算规则
将0变1
将1变0
左移
运算规则
左移n位,相当于给一个十进制数乘以2的n次方
右移
运算规则
右移n位,相当于给一个十进制数除以2的n次方
前三个是两个二进制数之间的运算
后三个是一个二进制数自身的运算
C语言 位运算
###位运算的逻辑:
1:(位与)运算符():双目操作符,当两个位进行相与时,只有两者都为“1”时结果才为“1”(即:全真为真,一假为假),运算规则如下:
左运算量 右运算量 运算结果
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1
运算:
例:
#include stdio.h
int main(int argc,char *crgv[]){
unsigned char x=0156, y=0xaf, z;
z=xy;
printf("%d",z)
}
结果为:0x2e
运算过程:0156(8进制)==0000 0110 1110(2进制);
进行 (位与运算)
0xaf(16进制) ==0000 1010 1111(2进制);
结果:0000 0010 1110(2进制)==0x2e(十六进制);
2:位或运算符(|):
双目操作符,当两个 位 进行相或时,两者中只要有一方为“1”,结果就为“1”(即:一真为真,两假为假),运算规则如下:
左运算量 右运算量 (|) 运算结果
0 | 0 = 0
1 | 1 = 1
0 | 1 = 1
1 | 1 = 1
例:
#include stdio.h
int main(int argv,char *argc[]){
unsigned char x=027,y=0x75;
z=x|y;
}
运行过程:
027(8进制)=0001 0111(2进制)
进行 |(位或运算)
0x75(16进制)=0111 0101(2进制)
结果:0111 0111(2进制)=0x77(16进制)
3.异或运算(^):
当两个位进行异或时,只要两者相同,结果为“0”,否者结果为“1”,(即:同假异真)运算规则如下:
左运算量 右运算量 (^) 运算结果
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
例:
#include
int main(int argv,char *argc[]){
unsigned(无符号) char x=25,y=0263,z;
z=x^y;
printf("%d\n",z);
}
运算过程:
25(十进制)=0001 1001(二进制)
运算 ^(异或运算)
0263(8进制)=1011 0011(二进制)
结果:1010 1010(二进制)=0252(8进制)
4:移位操作符(“” 或 ""):位移位运算的一般形式:运算量运算符表达式;
运算量必须为整型结果数值:
运算符为左移位()或 右移位()运算;
表达式也必须为整型结果数值;
移位操作就是把一个数值左移或右移若干位;假如左移n位,原来值最左边的n位数被丢掉,右边n卫补“0” ;右移操作就是和左移操作移动方向相反;
符号位的处理方法:
(1):逻辑移位,不考虑符号问题,原数值右移n位后,左边空出的n歌位置,用0填充;
(2):算术移位,原来值进行了右移操作后,需要保证符号位不变,因此,右移n位后,左边空出的n个位置,用原数值的符号位填充。原来若是负数,则符号位为“1”,填充的位也是“1”;原来若是正数,则符号位为“0”,填充的位也是“0”,这样保证移位后的数据与原数正负相同;
例:“1000 1001”将其右移两位,逻辑移位的结果为“0010 0010”,算术移位为:“1110 0010”;
将其左移两位,逻辑移位和算术移位的结果为:“0010 0100”;
(3)***补充:特定位清零(由“1”变成“0”)用 位与 操作;特定位变“1”(由“0”变成“1”)用 位或操作;
例:
a、请把0xd5的第2位进行清零操作
0xd5=1101 0101=1101 0001
1111 1011
~0000 0100
=0000 00012
~(0x012)0xd5
b、请把0xed的第3位进行清零操作
0xed=1110 1101=1110 0101
1111 0111
~
0000 1000
= 0000 00013
~(0x013)0xed
c、请把0x7d的第2-4位进行清零
0x7d=0111 1101=0110 0001
1110 0011
~
0001 1100
=
0000 01112
~(0x07)0x7d
d、请把0x7d的第2位和第3位进行清零
0x7d=0111 1101=0111 0001
1111 0011
~
0000 1100
0000 00112
~(0x032)0x7d
e、请把0xc7的第4位进行置1
0xc7=1100 0111=1101 0111
0001 0000
=0000 00014
=~(0x014)|0xc7
f、请把0x87的第3位进行置1
0x87=1000 0111=1000 1111
0000 1000
~(0x013)|0x87
g、请把0xc7的第3—5位置1
0xc7=1100 0111=1111 1111
0011 1000
0000 01113
~(0x073)|0x87
c语言的位符号 都是怎么运算的啊
C语言提供的位运算符列表:
运算符
含义
描述
按位与
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|
按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1
^
按位异或
若参加运算的两个二进制位值相同则为0,否则为1
~
取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
左移
用来将一个数的各二进制位全部左移N位,右补0
右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0