直面 位操作

来源:互联网 发布:打数字软件 编辑:程序博客网 时间:2024/06/07 18:45

以前看到位操作都躲得远远的,今天总结一下,玩死它:

>>运算符把位向右移动,<<运算符把位向左移动。只要没有舍弃位,向左移动n位就相当于把该数值乘以2的n次方。换言之,就等于把该数值乘以2^n。同样,向右移动n位就相当于把该数值除以2的n次方。但要注意,变量number向左移位时,如果舍弃了重要的位,结果就不是我们希望的那样了。如果需要修改原来的值,可以使用op= 赋值运算符。在这种情况下,可以使用>>=或<<=运算符(类似于+=,-=)。

移动符号位的原因是为了保持向右移位和除法运算的一致性。可以用char类型的变量来说明这一点,解释其工作原理。假定把value定义为char类型,其初始值为–104(十进制): signed char value=–104; 
其二进制表示为10011000。使用下面的操作把它向右移动两位: value >>= 2; //Result 11100110 
注释中显示了其二进制结果。右边溢出了两个0,因为符号位是1,就在左边空出来的位上填充1。该结果的十进制表示是–26,这正好是value的值除以4的结果。当然,对于不带符号的整数类型的操作,符号位不移动,在左边空出来的位上填充0。所以,应总是使用不带符号的整数,以确保避免高阶位的移位。

------------

~ 取反: 1变成0;0变成1;

& 按位与运算符: 如果相应的位都是1,结果位就是1,否则就是0;

^ 按位异或运算符:如果一个位是1,另一个位是0,结果位就是1。如果相应的位相同,结果位就是0;

|  按位或运算符:如果两个对应的位中有一个是1,结果位就是1。如果两个位都是0,结果就是0

(优先级从上到下)


搞了半天总共就6个符号:,,~,&,|,^


至于每一个的用途,如下:

获取i 比特位的值:

x & (1<<i)
将i 比特位的值设置为1:

x | (1<<i)
将i 比特位的值设置为0:

x & ( ~(1<<i))
将i 比特位及其之前的值设置为0,其后的值保留:

x & ( (1<<i)-1)

将i 比特位之后的值设置为0, 其他值保留:

x & ( ~((1<<i)-1))

将i比特位的值设置为0, 将j 比特位的值设置为1:

x & (~(1<<i)) | (1<<j)
</pre>应用<p></p><p><span style="background-color:rgb(255,255,51)"></span></p><pre name="code" class="java">boolean isAllUnique(String s) {int checker = 0;for (int i = 0; i < s.length(); i++) {int val = s.charAt(i) - 'a';if ((checker & (1 << val)) > 0)return false;checker |= (1 << val);}return true;}


如下转自(http://www.iteblog.com/archives/740)

1、当移位的数是正数的时候,>> 和>>>效果都是一样的;

  2、当移位的数是负数的时候,>>将二进制高位用1补上,而>>>将二进制高位用0补上,这就导致了>>>将负数的移位操作结果变成了正数(因为高位用0补上了)。


0 0