位运算符:按位取反(~)、位与(&)、位或(|)、位异或(^);左移运算符(<<)、右移运算符(>>)

位运算可对变量中的个别位进行操作,您可能对这样做的原因感到奇怪,这种能力有时确实是必须的,或者至少是有用的。

位运算符可以分为两大类:1、位逻辑运算符;2、移位运算符

1、位逻辑运算符:

位运算符用于整型数据,包括char。讲这些位运算符作为位运算的的原因是:他们对每位进行操作而不影响左右两位的值。注意:请不要将位逻辑运算符与常规的逻辑运算符(&&、||、!)混用,常规的逻辑运算符是对整个值进行操作。

按位取反(~):是一元运算符,是将每个0变为1,将每个1变为0,如下例子:

int a=7

a=0000 0111

int b=~a;//进行按位取反得到的是这个数的原码,在计算机中数值一律由补码进行存储

b=1111 1000 //原码

    1000 0111//反码

    1000 1000//补码=-8

对b的原码进行反码、补码操作后,可得到b=-8;

原码如何转换成反码、补码(这里对原码、反码、补码进行详细讲解)

运行结果:

位与(&):二元运算符,通过对两个操作数逐位进行比较产生一个新值;对于每个位,只有两个操作数的对应为都为1时结果才为1,否则为0。

int a=7;

a=0000 0111

int b=12;

b=0000 1100

int c=a&b;

c=0000 0100;//c=4

运行结果:

 

位或(|):二元运算符,通过对两个操作数逐一进行比较产生一个新值;对于每个位,只要有一个操作数的位是1,结果就是1,否者为0。

int a=7;

a=0000 0111

int b=12;

b=0000 1100

int c=a|b;

c=0000 1111;//c=15

运行结果:

 

位异或(^):二元运算符^,通过对两个逐位进行比较产生一个新值;如果操作数中的对应位有一个是1时那么结果为1,否则为0(两个0,两个1); 

int a=7;

a=0000 0111

int b=12;

b=0000 1100

int  c=a^b;

c=0000 1011;//c=11

运行结果:

 

2、移位运算符:

以为运算符将位向左或向右移动,同样我们仍将用二进制的形式来说明该机制的工作原理。

左移(<<):

左移运算符<<将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数决定。空出来的位用0填充,并且丢弃移出左侧操作数末端的位。

int a=1;

a=0000 0001

b=a<<1;//使a向左移一位

b=0000 0010//b=2

总结:左移一位相当于原来的乘2

运行结果:

 

右移(>>):

右移操作符>>将其右侧操作数的值的每位向右移动,移动的位数由其右侧操作数决定。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器,空出的位可能用0填充,或者使用符号位(最左端)的副本填充。

int a=2;

a=0000 0010

int b=a>>1;//使a向左移一位

b=0000 0001//b=1;

总结:右移一位相当于原来的值除以2;

运行结果:

 

移位运算符的优点:能够提供快捷、高效对2的幂的乘法和除法;

number << n

number乘以2的n次幂

number >> n

如果number非负,则用number除以2的n次幂

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值