重新学习位运算

位运算符符号表示定义运算结果
按位非~单数操作,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次方所代表的数

十进制二进制
81000
1610000
32100000
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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值