位运算合集

文章介绍了几种使用Java编程语言进行位运算的方法,包括计算32位编码中0的个数、反转整数的位、实现乘法运算以及在给定数组中找到只出现一次的元素。这些方法涉及到了位与、位左移、位右移和异或等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NB189 牛群的编码统计
在一个农场中,农夫使用32位有符号整数的二进制字符串来编码他的牛群。有一天,农夫想要统计一下他的牛群中,编码中’0’的个数。现在,农夫给出了一头牛的编码 n,你需要帮他计算出编码中’0’的个数。(要考虑正数和负数)

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int countZeros (int n) {
        int count = 0;
        for(int i = 0; i < 32; i++){
            count += (n>>i)&1;//和1相与得出1的个数
        }
        return 32-count;
    }
}

NB190 编码反转
输入:
1
复制
返回值:
-2147483648
复制
说明:
00000000 00000000 00000000 00000001
翻转后为
10000000 00000000 00000000 00000000

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int reverseBits (int n) {
        int ans = 0;
        for(int i = 0; i < 32; i++){
            ans <<= 1;
            ans |= n&1;
            n >>= 1;
        }
        return ans;
    }
}

NB191用位运算实现乘法运算

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param a int整型 
     * @return int整型
     */
    public int multiply (int n, int a) {
        int res = 0;
        while(a != 0){
            if((a&1) == 1){
                res = add(res, n);
            }
            n <<= 1;
            a >>= 1;
        }
        return res;
    }
    int add(int a, int b){
        while(b != 0){
            int temp = a^b;
            b = (a & b) << 1;
            a = temp;
        }
        return a;
    }
}

扩展:获取数字中最右侧的1 n&(~n+1)或者n&(-n)
判断2的幂——小于0不对,return n&(-n)==n;
判断4的幂——先判断是2的幂 return (n&oxaaaaaaaa)==0;
输出大于等于n的2的幂——小于0输出1,2的幂输出,n|=n>>1/2/4/8/16把最高位后面都变成1 return n+1;
异或中:n^n=0
leetcode 260
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

class Solution {
    public int[] singleNumber(int[] nums) {
        int xorsum = 0;
        for (int num : nums) {
            xorsum ^= num;
        }
        // 防止溢出 如果是一个元素return xorsum;
        int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));
        int type1 = 0, type2 = 0;
        for (int num : nums) {
            if ((num & lsb) != 0) {
                type1 ^= num;
            } else {
                type2 ^= num;
            }
        }
        return new int[]{type1, type2};
    }
}


NB194 有些牛被标记了三次,有一个牛标记一次,找出标记一次的。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int singleNumberII (int[] nums) {
        int ones = 0, twos =  0;
        for(int n : nums){
            ones = (ones ^ n) & ~twos;
            twos = (twos ^ n) & ~ones;
        }
        return ones;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值