码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 位运算技巧及leetcode相关例题Java实现


    目录

    一、异或运算符的运用&&leetcode136

    异或运算符 a ^ b ^ b = a

    leetcode136

    二、n & (n - 1)&&leetcode133

    n & (n - 1):消除n最右边的一个1

    leetcode133/剑指offer15

    三、m的n次方(n是正整数)

    常规写法

    二进制的快速幂算法


    一、异或运算符的运用&&leetcode136

    异或运算符 a ^ b ^ b = a

    1)两个数相同,异或的结果为0。

    2)任何数和0异或结果都等于它本身。

    3)异或支持交换律。

    leetcode136

    1. //把所有的数异或,两个相同的元素就会被消掉
    2. class Solution {
    3. public int singleNumber(int[] nums) {
    4. int res = 0;
    5. for(int i = 0; i < nums.length; i++){
    6. res = res ^ nums[i];
    7. }
    8. return res;
    9. }
    10. }

    二、n & (n - 1)&&leetcode133

    n & (n - 1):消除n最右边的一个1

    n = 10100

    n & (n - 1) = 10000   

    原理是借位: 10100 - 1 = 10011     10100 & 10011 = 10000

    leetcode133/剑指offer15

    1. public class Solution {
    2. // you need to treat n as an unsigned value
    3. public int hammingWeight(int n) {
    4. int sum = 0;
    5. while(n != 0){
    6. n = n & (n - 1);
    7. sum++;
    8. }
    9. return sum;
    10. }
    11. }

    三、m的n次方(n是正整数)

    常规循环写法

     

    二进制的快速幂算法

    假设n = 13 = 1101 = 1 + 4 + 8

    那么 m ^ 13 = m^1 * m^4 * m^8 = m ^ 1 * m^100 * m^1000

    判断二进制有多少个1。这是快速幂算法来计算幂。它的基本思想是将指数n分解为若干个二进制位,然后根据每一位的值来决定是否将当前的底数m乘到结果中。具体来说,如果n的二进制表示的最后一位是1,则将m乘到结果中;然后将m平方,以便在下一次循环中进行计算。最后,通过不断地将n右移一位(即除以2),直到n变为0为止。最终返回的结果就是m的n次方。

    1. //n是正整数
    2. int pow(int m, int n) {
    3. int sum = 1; // 初始化结果为1
    4. int tmp = m; // 将m的值赋给临时变量tmp
    5. while (n != 0) {
    6. if (n & 1 == 1) {
    7. sum *= tmp; // 如果n的二进制表示的最后一位是1,则将tmp乘到sum上
    8. }
    9. tmp *= tmp; // 将tmp平方,以便在下一次循环中进行计算
    10. n = n >> 1; // 将n右移一位,相当于除以2
    11. }
    12. return sum; // 返回最终的结果
    13. }
  • 相关阅读:
    IM即时通讯开发之WebSocket断网重连更快的方法
    沁恒CH32V003F4P6 开发板上手报告和Win10环境配置
    欧标插头EN50075测试项目
    大数据可视化BI分析工具Apache Superset实现公网远程访问
    【Rust 基础篇】Rust默认泛型参数:简化泛型使用
    常用Linux命令
    【MySQL篇】第二篇——库的操作
    【MySQL】如何使用SQL语句获取表结构和获取全部表名
    CSS画圆以及CSS实现动态圆
    模拟面试-1
  • 原文地址:https://blog.csdn.net/xiaoliii0401/article/details/134535503
  • 最新文章
  • polygon出题教程
    Manim物理模拟:别自己写欧拉了!
    AI 学习笔记:Agent 的应用演示
    分享一个CAN报文编辑器软件
    MiniCPM-V 4.6 部署实战:基于 GPUStack 与 SGLang 的端侧多模态模型部署
    用 FRP 打通云服务器与本地 Ubuntu,让 Codex 远程调试本地硬件
    软考 - 架构设计师 知识点总结
    给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍
    聊一聊 MES系统如何实现多种标签打印并支持不同打印机
    断尺问题:戴德金分割现实悖论
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号