位运算题目汇总

给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。

输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 01 的数。
[1,2,4,8] 都有 11[3,5,6]21[7]31 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]

思路:首先统计1的个数;然后通过自定义比较器;先按照1的个数进行排序,然后按照数值大小排序;统计1的个数;这里利用n&(n-1)可以消掉1个1特性;这里主要比较器定义;


public class Main1 {
    public static int get1(int n) {
        int count = 0;
        while (n != 0) {
            n &= (n - 1);
            count++;
        }
        return count;
    }
    public static void main(String[] args) {
        Integer tmp[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};

        Arrays.sort(tmp, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {

                int diff = get1((Integer) o1) - get1((Integer) o2);
                if (diff == 0) return (Integer) o1 - (Integer) o2;
                return diff;
            }
        });
   

    }
}


计算一个数字的二进制1的个数

思路:1&1=11&0=0;
num 右移操作;从而判别二进制个数:
fn(int a){
int count=0;
while(a>0){
if(num&1)==1){
count++;
}
num=(num>>1);
}}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值