`

Bit Manipulation总结(二)

阅读更多
这篇文章介绍通过位运算求解子集,反转二进制数,判断是否为2的幂等。

1,Number of 1 Bits
给定一个无符号的整数,输出它包含1的个数。

通过右移,依次与1位与,得到1的个数。 代码如下:
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        for(int i = 0; i < 32; i++) {
            if((n >> i & 1) == 1) {
                count ++;
            }
        }
        return count;
    }
}


2,Subsets
给定一个没有重复元素的数组,输出所有的子集。
例如:给定nums[] = {1,2,3}
输出:[[3], [1], [2], [1,2,3], [1,3],[2,3],[1,2],[] ]

我们知道长度为n的集合,子集的个数为2的n次方个,我们通过0到2^n - 1正好可以表示子集的状态,具体代码如下:
public class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<Integer> list = new ArrayList<Integer>();
        List<List<Integer>> llist = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        int helper = 1;
        for(int i = 0; i < Math.pow(2, nums.length); i++) {
            for(int j = 0; j < nums.length; j++) {
                if(((i >> j) & helper) == 1) {
                    list.add(nums[j]);
                }
            }
            llist.add(new ArrayList<Integer>(list));
            list.clear();
        }
        return llist;
    }
}


3,Reverse Bits
给定一个无符号整数n,将它的二进制序列反转。

我们每次取n的最后一位,然后再通过左移,得到最终结果。 代码如下:
public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int result = 0;
        for(int i = 0; i < 32; i++) {
            result = result << 1;
            result |= ((n >> i)& 1);
        }
        return result;
    }
}


4,Bitwise AND of Numbers Range
给定一个范围[m, n],将这个区间所有的数字位与,包括m和n, 0 <= m <= n <= 2147483647,输出最后结果。
例如,给定[5,7],输出:4

进行位与操作,位上有一个0,那么这个位置上肯定为0,因此我们只要从高位开始比较m和n,只要他们相等的位我们就保留,如果不相等就终止,因为后面肯定全为0。因为0 <= m <= n <= 2147483647,因此要把mask设定为长整型,因为把1左移31位后,如果是int型,最高位为符号位,与题意不符。代码如下:
public class Solution {
    public int rangeBitwiseAnd(int m, int n) {
        int result = 0;
        long mask = 1L << 31;
        while(mask > 0) {
            if((m & mask) == (n & mask)) {
                result |= (n & mask);
            } else {
                break;
            }
            mask = mask >> 1;
        }
        return result;
    }
}
分享到:
评论

相关推荐

    前端大厂最新面试题-bit-manipulation.docx

    前端大厂最新面试题-bit-manipulation.docx 本文档总结了前端大厂的最新面试题,主要集中在位运算方面的知识点。通过对题目的分析,我们可以总结出以下几个方面的知识点: 1. 位运算的基本概念 在计算机科学中,...

    Android模块里面增加JNI的方法,调用c代码

    `System.loadLibrary("bitmanipulation")`是用来加载本地库的,这里的库名"bitmanipulation"是与C/C++代码中的`.so`文件对应的部分。 接下来,使用`javah`命令生成C语言的头文件(JNI头文件)。在Android Studio的...

    Mysql基础笔记总结

    - **DML(Data Manipulation Language)数据操作语言**:用于插入(`INSERT`)、更新(`UPDATE`)、删除(`DELETE`)表中的数据。 - **DQL(Data Query Language)数据查询语言**:主要用于检索数据,最常用的命令是...

    c5.rar_c51函数有哪些_reaction speed

    5. **Bit Manipulation Functions**: `bit bit_variable` 用于声明位变量,`bit_set(bit_variable)`、`bit_clear(bit_variable)` 和 `bit_toggle(bit_variable)` 用于操作位。 在描述中提到的“1时间函数举例4”...

    leetcode分类-leetcode:多思考,多总结

    多思考,多总结 刷题顺序参考: Array String Math Tree Backtracking Dynamic Programming LinkedList Binary Search Matrix DFS & BFS Stack & PriorityQueue Bit Manipulation Topological Sort Random Graph ...

    ACM算法总结

    13. 对二进制的 1 个数的处理(Bit Manipulation) 对二进制的 1 个数的处理是一种常用的算法,用于处理二进制数中的某一位。该算法广泛应用于计算机科学和信息技术领域。 14. 大数求余(Modular Arithmetic) ...

    linux kernel 2.4-7 内核函数手册

    `set_bit`, `__set_bit`, `clear_bit`, `__change_bit`, `change_bit`, `test_and_set_bit`, `__test_and_set_bit`, `test_and_clear_bit`, `__test_and_clear_bit`, `test_and_change_bit`, `test_bit`, `find_...

    SQL语言总结(适用于初学者)

    DML(Data Manipulation Language)包括插入、修改和删除数据记录的语句。 1. 插入数据记录使用INSERT语句。 2. 修改数据记录使用UPDATE语句。 3. 删除数据记录使用DELETE语句。 五、视图 视图是虚拟表,是从一...

    leetcode题库-Leetcode-Summary:Leetcode刷题总结(Java版)——更新中

    位运算(bit_manipulation_items)   数组中出现次数超过一半的数字(More_than_half_of_the_occurrences_in_the_array.java)   二进制中1的个数(The_number_of_1s_in_binary.java)   主要元素(Main_...

    单片机C语言源码学习参考-无线遥控应用程序与仿真.zip

    C语言中的位操作(bit manipulation)技巧在此处非常重要,学习者需要了解如何设置、读取和清除单片机寄存器中的特定位来实现数据编码与解码。 3. **中断处理**:单片机通常会利用中断来响应无线接收器接收到的数据...

    leetcode100-awesome-interview-resources:很棒的采访资源

    leetcode 100 很棒的采访资源 ...总结:如何使用Bit Manipulation轻松高效地解决问题 最受欢迎的 100 个问题LeetCode 前100 个问题主题明智 PDF 动态编程模式 竞争性编程的专业提示 用于 C++竞争性编程的快速 I/O

    SQL知识点汇总【完整版】

    * 二进制数据类型:包括 Binary、Varbinary 和 Image 等数据类型,用于存储图像、照片等二进制数据。 * 字符数据类型:包括 Char、Varchar 和 Text 等数据类型,用于存储字符数据。 * Unicode 数据类型:包括 Nchar...

    INTEL指令集

    8. **其他扩展**:还有如BMI(Bit Manipulation Instruction)、FMA(融合乘加)等指令集,分别提供了更高效的位操作和浮点运算。 了解和掌握INTEL指令集对于软件开发、系统编程和优化至关重要。开发者可以通过使用...

    Linux核心API文档

    以上总结了《Linux核心API文档》中的部分重要知识点,覆盖了驱动程序基础、数据类型处理、基本C库函数以及内存管理等方面的内容。这些知识点对于深入理解和开发基于Linux内核的应用程序具有重要意义。

    LeetCode练习答案

    根据所提供的部分目录,可以看出该文档涵盖了数组(Array)、位操作(Bit Manipulation)、树(Tree)、动态规划(Dynamic Programming)、回溯(Backtracking)、贪心(Greedy)、链表(LinkedList)、数学(Math)和字符串(String)...

    算法刷题笔记leetcode/lintcode

    - Bit Manipulation(位操作) #### Part II - Coding 这部分涵盖了具体的编程题目及其解决方案,主要针对LeetCode和LintCode上的练习题。 - **String**(字符串处理) - Implement strStr(实现strStr函数) ...

    Algorithms for programmers

    - **1.23 颜色的操纵(Manipulation of colors)** - 讨论了在图像处理中颜色值的操作方法。 - **1.24 2-进制逆和平方根(2-adic inverse and square root)** - 介绍了在2-进制数系下计算逆元和平方根的方法。 - ...

    The MIPS64 Instruction_IIA

    - **Bit Manipulation**:AND、OR、XOR等指令用于执行位操作。 #### 四、应用案例分析 假设在一个高性能计算应用中,需要频繁执行浮点数相加运算。使用MIPS64架构的处理器时,可以通过以下步骤优化性能: 1. **...

    c&c++葵花宝典

    2. 位操作(Bit manipulation): - C/C++提供了丰富的位操作符,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移()和右移(&gt;&gt;)等。位操作在处理硬件寄存器、执行效率优化等方面非常有用。 3. 指针和数组: - 在...

    2023-2024卫生招聘考试之卫生招聘(计算机信息管理)专项刷题训练.pdf

    根据提供的文件信息,我们可以总结出一系列与计算机信息管理相关的知识点,这些知识点对于准备参加2023-2024年卫生招聘考试的考生来说非常重要。下面将详细解释每个题目涉及的知识点: ### 1. 网络数据库接口 题目...

Global site tag (gtag.js) - Google Analytics