JAVA基础------算法-------位运算符(看源码必备), 二进制与十进制之间的转换

一:什么叫位运算符,为什么会出现位运算符?

我们知道,程序中的所有数在计算机底层都是由二进制的形式存储的,"0"和"1"是他的基础,位运算就是直接对整数在内存中的二进制位进行操作。

二:常规的位运算有哪些?

这里是引用

在这里插入图片描述

三:二进制与十进制的互相转换:

转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制;

===================================正数转二进制
1、正整数转成二进制。要点一定一定要记住:除二取余,然后倒序排列,高位补零。

2、也就是说,将正的十进制数除以二,得到的商再除以二,依次类推知道商为零或一时为止,然后在旁边标出各步的余数,最后倒着写出来,高位补零就OK咧。比如42转换为二进制,除2取余再取反后得到的是101010,高位补齐得到的是00101010(计算机的底层默认是8位)

3、 42除以2得到的余数分别为010101,然后咱们倒着排一下,42所对应二进制就是101010.

4、计算机内部表示数的字节单位是定长的,如8位,16位,或32位。所以,位数不够时,高位补零,42转换成二进制以后就是。00101010,也即规范的写法为(42)10=(00101010)2

=====================================负数转二进制

5、负整数转换成二进制
方法:先是将对应的正整数转换成二进制后,对二进制取反,然后对结果再加一。还以42为例,负整数就是-42,最后即为:(-42)10=(11010110)2.

========================================小数转二进制

6、小数转换为二进制的方法:对小数点以后的数乘以2,有一个结果吧,取结果的整数部分(不是1就是0喽),然后再用小数部分再乘以2,再取结果的整数部分……以此类推,直到小数部分为0或者位数已经够了就OK了。然后把取的整数部分按先后次序排列就OK了,就构成了二进制小数部分的序列,举个例子吧,比如0.125,
7、如果小数的整数部分有大于0的整数时该如何转换呢?如以上整数转换成二进制,小数转换成二进制,然后加在一起就OK了,如图6所示。

==========================================二进制转十进制

8、整数二进制转换为十进制:首先将二进制数补齐位数,首位如果是0就代表是正整数,如果首位是1则代表是负整数。
先看首位是0的正整数,补齐位数以后,将二进制中的位数分别将下边对应的值相乘,然后相加得到的就为十进制,比如1010转换为十进制,方法如图7所示。
9、若二进制补足位数后首位为1时,就需要先取反再换算:例如,11101011,首位为1,那么就先取反吧:-00010100,然后算一下10100对应的十进制为20,所以对应的十进制为-20,

10、将有小数的二进制转换为十进制时:例如0.1101转换为十进制的方法:将二进制中的四位数分别与 2的-n次 相乘后相加得到的值即为换算后的十进制。
四:一些简单的位运算:
1: 使用位运算判断一个数的奇偶性
a % 2 等价于 a & 1

public static void main(String[] args) {
//方式1
int num=6;
if(num%2 == 0){
System.out.println(num + "是偶数");
}else{
System.out.println(num + "是奇数");
}

//方式2 位运算 
if((num & 1) == 0){
System.out.println(num + "是偶数");
}else{
System.out.println(num + "是奇数");
}
}

2:不使用第三个数,交换两个数。x = x ^ y , y = x ^ y , x = x ^ y。

    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        //不适用第三个数 将两个数做交换 考虑使用位运算符中的  异或^
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println(a);
    }
}
程序输出为5;

3:如何判断一个整数为 2 的整数次幂
给定一个无符号整型(UInt)变量,判断是否为 2 的整数次幂
思路:一个整数如果是 2 的整数次方,那么它的二进制表示中有且只有一位是 1,而其它所有为都是 0,根据前面的分析,把这个整数减去 1 后再和它自己做与运算,这个整数中唯一的 1 就变成 0 了,也就是得到的结果为 0。

(num & (num - 1)) == 0

4:求两数之和(不使用+ 或者 - 来实现整数运算)
“异或”是一个无进位加法,说白了就是把进位砍掉。比如01^01=00。(二进制的每一位相同返回0,不同返回1)
“与”可以用来获取进位,比如01&01=01,然后再把结果左移一位,就可以获取进位结果。(都是1,才返回1)

这里是引用

在这里插入图片描述

    public static void main(String[] args) {
        int a = 3;
        int b = 5;
      while(a != 0) {
      //a&b(先将a和b都转换位二进制,都是1才是1,<<1 向左进一位)
        int tmp = (a & b) << 1;
        b = a ^ b;
        a = tmp;
    }
        System.out.println(a);
    }
}

5:求是否是2的幂等
对于N为2的幂的数,都有 N&(N-1)==0 ,所以这就是我们的判断条件。
6:判断一个数组中只出现一次的数字

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值