重新学习位运算

来源:互联网 发布:海绵软件 编辑:程序博客网 时间:2024/06/06 01:12
位运算符 符号表示 定义 运算结果 按位非 ~ 单数操作,0变1,1变0 按位或 | 两个二进制数相同位只要有一个为1就为1 取大运算(结果不会小于最大的那个数) 按位与 & 同1才1 取小运算(结果不会大于最小的那个数) 按位异或 ^ 相同为0不同为1,00为1,11为1 结果大小无规律 >> 有符号右移 二进制数右移n位,左边填充符号位上的数字 除以2n >>> 无符号右移 二进制数右移n位,左边统统填充0 除以2n << 有符号左移 二进制数右移n位,右边填充0 乘以2n

java中不存在无符号左移
最高位代表符号位,0代表正数,1代表负数
位运算符主要针对两个二进制数的位进行逻辑运算,计算机存储的都是补码, 参与运算的也是补码但是正数的补码跟原码反码是一样的,对于负数来说原码所代表的才是真值
8位的(-11)-1011的原码为10001011最高位为符号位
反码为:除符号位外源码取反11110100
补码为源码除符号位外取反加1:11110101
补码变原码 除符号位外取反加1
反码变源码除符号位所有位取反
反码加1变补码

比如-11+1就是11110101+00000001=10001010最高位为1,结果为负数,转换为原码就是10001010(10)
-11+12就是11110101+10001100=00000001最高位为0,结果为正数表示1

当给定一个数时,我们需要求大于它而且最接近他的2的n次方所代表的数

十进制 二进制 8 1000 16 10000 32 100000
public int change(int num){    i=num;    i--;//避免传过来的数为$2^n$    //1+2+4+8+16=31    i|=i>>>1;    i|=i>>>2;    i|=i>>>4;    i|i=>>>8;    i|=i>>>16;    return i;}
原创粉丝点击