本文目录一览:
c语言里的按位或是怎么算的?
有一个常识需求了解一下。整型数在内存中是以补码形式表示的,如下式:
15 = 00001111
-9 = 11110111
-----------------------------
11111111 = (-1)
|是把15和-9两个补码按位作“或”运算,结果是一个全1的数(也是补码形式),从补码知识就知道这个数是-1
C语言中什么是按位或运算
位运算是在二进制层面上进行的运算
位或就是在两个二进制上进行按位的或运算
像普通的逻辑运算一样 两个里有一个为真就返回真(逻辑真 就是1 逻辑假就是0)
比如两个十进制数 5 和 3 进行位或运算
把他们转换为二进制
5的二进制是 0101
3的二进制是 0011
他们按位或的结果是0111 转换到十进制就是0+4+2+1 是7
C语言中位运算是怎么样的?
就是对一个X进制数对应在内存中存放为二进制形式的数码,进行二进制的位的操作后,得到原进制数值。
位操作有:与、或I、异^、左移、右移。
根据这些符号所代表的操作规则来计算一个数的二进制。
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