位运算符
- 位运算符只作用于整型与字符型的二进制位;
- 位运算都是针对数据的补码进行处理的;
- 位运算符主要分为以下6类:
- 位与 -- &
- 位或 -- |
- 位异或 -- ^
- 位反 -- ~
- 位左移 -- <<
- 位右移 -- >>
移位运算 (位左移 -- <<) 与 (位右移 -- >>)
- 又分为
逻辑移位
与算术移位
;
- 逻辑移位的特征:
- 逻辑移位针对正数,所有二进制位发生移动;
- 左移规则: 低位补零;
- 右移规则: 高位补零,低位丢弃;
- 算术移位的特征:
- 算术移位针对负数,所有二进制位发生移动;
- 左移规则: 低位补零;
- 右移规则: 高位补1,低位丢弃;
- 为了保证负数的符号位不变,在右移时,在高位补1;
int main(int argc, const char * argv[]) {
@autoreleasepool {
///正数
//逻辑左移 所有二进制位向左移动 低位补0
int c = 65; //1000001
c <<= 3; //1000001000
NSLog(@" c = %d",c);
//逻辑右移 所有二进制位向右移动 高位补0,低位丢弃
int n = 65; //1000001
n >>= 2; //0010000
NSLog(@" n = %d",n);
///负数
//算术右移 所有二进制位向右移动 高位补1,低位丢弃
//-65
//原码 11000001
//反码 10111110 (符号位不变,数值位取反)
//补码 10111111 (反码+1)
//右移1 11011111 (高位补1,地位丢弃) -- 补码
//反码 11011110 (补码-1)
//原码 10100001 (符号位不变,数值位取反)
//-33
int p = -65;
p >>= 1;
NSLog(@" p = %d",p);
//算术左移 所有二进制位向左移动 低位补0
//-65
//原码 11000001
//反码 10111110 (符号位不变,数值位取反)
//补码 10111111 (反码+1)
//左移1 101111110
//反码 101111101
//原码 110000010
//-130
int m = -65;
m <<= 1;
NSLog(@" m = %d",m);
}
return 0;
}
位与 -- &
- 运算规则:参加运算的两个数先转成二进制数 然后比较相同二进制位上的两个数;只有两个数同时为1,则该位结果才为1,否则为0; (负数按补码形式参加按位与运算)
int main(int argc, const char * argv[]) {
@autoreleasepool {
//位与& --> 比较相同二进制位上的两个数;只有两个数同时为1,则该位结果才为1,否则为0
int a = 3; //0000 0011
int b = 5; //0000 0101
int c = a & b;//0000 0001
NSLog(@" c = %d",c); //最终c=1
}
return 0;
}
位或 -- |
- 位上的两个数;只要两个数有一个为1,则该位结果就为1,否则为0;
int main(int argc, const char * argv[]) {
@autoreleasepool {
//位与& --> 只要两个数有一个为1,则该位结果就为1,否则为0;
int a = 6; //0000 0110
int b = 9; //0000 1001
int c = a | b;//0000 1111
NSLog(@" c = %d",c); //最终c=15
}
return 0;
}
位异或 -- ^
- 运算规则:参加运算的两个数先转成二进制数 然后比较相同二进制位上的两个数;当果两个数值不同时,则该位结果为1,否则为0。
int main(int argc, const char * argv[]) {
@autoreleasepool {
//位与& --> 当果两个数 值不同时,则该位结果为1,否则为0
int a = 6; //0000 0110
int b = 9; //0000 1001
int c = a ^ b;//0000 1111
NSLog(@" c = %d",c); //最终c=15
}
return 0;
}
网友评论