算法之位运算与数论(java)

一、整型的存储

1. 原码
  • 正数(包括+0):符号位为0,数值位由十进制转为二进制存储。
  • 负数(包括-0):符号位为1,数值位由十进制转为二进制存储。
  • 0有两种表示(+0和-0)
  • 字长为n,表示范围为-(2n-1 - 1) ~ 2n-1 - 1
2. 反码
  • 正数(包括+0):与原码一致。
  • 负数(包括-0):符号位为1,数值位由原码按位取反。
  • 0有两种表示(+0和-0)
  • 字长为n,表示范围为-(2n-1 - 1) ~ 2n-1 - 1
3. 补码
  • 正数(包括+0和-0):与原码一致。
  • 负数:符号位为1,数值位由反码加1。
  • 0仅有一种表示,即全零存储。
  • 计算机中整型存储都用补码。
  • 字长为n,表示范围为-2n-1 ~ 2n-1 - 1

二、位运算

运算符号备注
按位与&
按位或|
按位异或^
按位取反~
左移<<右边补0
有符号右移>>正数(包括0):左边补0;负数:左边补1
无符号右移>>>左边补0

三、位运算应用

1. 整数的奇偶性判断
  • 判断奇数:(x & 1) == 1
  • 判断偶数:(x & 1) == 0
2. 对2的幂快速乘除
  • n<<k,n乘以2^k
  • n>>k,n除以2^k
3. swap不借助第三个变量
a ^= b;
b ^= a;
a ^= b;
4. 将最右侧的1改为0
  • n = n & (n - 1)
5. 求n的相反数
  • n = ~n + 1
6. 切换a和b赋值给x(x初始为a和b其中一个)
  • x= a ^ b ^ x

三、代码

剑指 Offer 16. 数值的整数次方

class Solution {
    public double myPow(double x, int n) {
        if (x == 0) {
            return 0;
        }
        long exp = n;
        if (n < 0) {
            x = 1 / x;
            exp = -exp;
        }
        double res = 1, base = x;
        while (exp != 0) {
            if ((exp & 1) == 1) {
                res = res * base;
            }
            base *= base;
            exp >>= 1;
        }
        return res;
    }
}

求一个整数是不是素数

public class Main {

    public boolean isPrimeNumber(int num) {
        if (num < 2) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

bitmap

/**
 * ASCLL码为0-127,其中32-126为可显示字符
 * 32为空格,48-57为数字,65-90为大写字母,97-122为小写字母
 */
public class Bitmap {

    private byte[] bytes;
    private int length;

    public Bitmap(int length) {
        this.length = length;
        bytes = new byte[length / 8 + 1];
    }

    public boolean get(int index) {
        if ((bytes[index >> 3] & 1 << (index & 7)) == 0) {
            return false;
        } else {
            return true;
        }
    }

    public void set(int index, boolean value) {
        if (value) {
            bytes[index >> 3] |= 1 << (index & 7);
        } else {
            bytes[index >> 3] &= ~(1 << (index & 7));
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值