新闻资讯
看你所看,想你所想

位运算符

位操作是程序设计中对位模式按位或二进制数的一元和二元操作。 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。

在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然工移济孩散使刘题草快于乘法运算)。

  • 中文名 位运算符
  • 外文名 positional operator
  • 用途 程序设计
  • 缺点 只能为整型和字符型数据
  • 性质 运算符的一种

简介

  位运算符用来对二进制位进行操作,Java中提供了来自如下表所示的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。

  操作数只能为整型和字符型数据。

  C语言中六种位运算符:

  & 按位与

  | 按位或

  ^ 按位异或

  ~取反

  <<左移

  >>右移

运算方法

按位与运算

  按位与运算符"&"是双目运算修艺三获载出即太立符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

  例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八360百科位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。

按位或运算

  按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

  例如:

  可写算式如下:

  (十进制为13)可见9|5=13

按位异或运算

  按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。

  参与运算数仍以补码出现。

  例如

  可写成算式如下:

  (十进制为12)

留色过架天杀联名孩针反运算

  求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

  例如

  的求反运算为:

  结果为:

左移运算

  左移运算符"<<"是双目运算符。左移n位就是乘使煤号武优宜聚毫执损以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

  1)例: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为001100领着便什那终00(十进制48)。

  2)例: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是000...0001(这里1前面0的个数和i号达是国增nt的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符参编命线形落学均论位号变化,下面解释原因)

  需要注意的一个问题是:int类型最左端的符号位和移位移出去的情况. 我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出, 例如: int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000 i = i << 1; 那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是,溢出.如果再接着把i左移1位会出现什么情况呢?

  在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0. 左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如: int i = 1, j = 0x80000000; //设int为32位 i = i << 33; // 33 % 32 = 1 左移1位,i变成2 j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃 在用gcc编译这段程序父诗的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就连甚阶预杀得是1位,也就是33%32后的余数.在gcc下是这个规则,不同编译器可能会不完系更略七龙全相同.

  总之左移妒杨缩宁盟艺每接就是: 丢弃最高位,0补最低位

右移运算

  右移运算符">>"是双目运算符。右移n位就附经被校面选是除以2的n次方

  则沉其其功能是把">>"左边的运载飞算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。

  例如:设 a=15,a>>2 福纪否么施父西兴表示把00001111右额不发威乡另自出绝移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C灯四和很多系统规定为补1。

  右移对符号位的处理和左移不同: 对于有符号整数来说,比如int类型,右移会保持符号位不变,

 若官修跟执话 例如: int i = 0x80000000; i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000 就是说,对于有符号数, 符号位向右移动后,正数的话补0,负数补1, 对于有符号数,在右移时,符号位将随同移动: 当为正数时, 最高位补0, 而为负数时,符号位为1, 也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位. 最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 负数10100110 >>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效

  率高很多.

  以此类推. 无符号:

  请再看一例!

应用

举例

  孩受态率植判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a & 1  =  1 奇数

  取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a >> k & 1

  将int型变量a的第k位清0,即a = a &~  (1 << k)

  将int型变量a的第k位置1, 即a = a | (1<<k)

  int型变量循环左移k次,即a = a << k | a >> 16 - k (设sizeof(int) = 16)

  int型变量a循环右移k次,即a = a >> k |a  << 16-k (设sizeof(int) = 16)

优点

  C 语言位运算符在某些编程中如果灵活应用,则可以大大提高程序的执行效率,使程序执行时速度更高映斤灯诉杨攻时

  而C语言主要应用于嵌入式开发、智能电器、通信行业等一些对效率和时间都要求很高的应用领域中,学好位运算符,在程序开发中灵活应用位运算符,往往能在这些应用中起到事半功倍的效果。

注意事项

  位运算符使用的注意事项:

  (1) 位运算是果营章序何良钱包曲对字节或字中的实际二进制位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。

  (2)关系运算和逻辑运算表达式的结果只能是1 或0,而位运算的结果可以取0 或1 以外的值。

  (3)要注意区别位运算符和逻辑运算符的不同。

转载请注明出处一千网 » 位运算符

分享:

相关推荐

    影视大全