当前位置: 首页 > news >正文

位运算的规则(算法村第十一关青铜挑战)

位运算规则

与(&)0&0=00&1=01&0=01&1=1
或(|)0|0=00|1=11|0=11|1=1
异或(^)0^0=00^1=11^0=11^1=0

按位与:&

参与运算的两数对应的二进位相与,只有对应的2个二进位均为1时,结果位才为1 ,否则为0

例:6 & 1 = 0

0110(6的二进制)

&

0001(1的二进制)

=

0000 (0的二进制)

按位或:|

参与运算的两数对应的二进位相或,只要对应的2个二进位有一个为1时,结果位就为1。

例:5 | 8 = 13

0101(5的二进制)

|

1000(8的二进制)

=

1101 (13的二进制)

按位异或:^

参与运算的两数各对应的二进位相异或,当对应的2个二进位相异时,结果位为1,相同则结果位为0。

例:9 ^ 5 = 12,
1001(9的二进制)

^
0101 (5的二进制)

1100 (12的二进制)

按位取反:~

对参与运算的数的各二进位按位求反。

~9:
~(1001) = 0110

左移:<<

按二进制形式把所有的数字向左移动对应的位数,高位舍弃,低位补零。

需要移位的数字 << 移位的次数

3 << 2 = 12

(0011 移位后得 1100)

在数字没有溢出的前提下,左移 n 位就相当于乘以 2n 次方。

右移:>>

按二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位补符号位(即正数补零,负数补1)。

需要移位的数字 >> 移位的次数

11>>2 = 2

(1011 移位后得 0010 )

对于正数,右移 n 位相当于除以 2n 次方。

位运算操作

判断 num 的第 i 位是否为 1

public boolean getBit(int num, int i)
{return (num & (1 << i)) != 0;
}

num 的第 i 位设置为 1

public int setBit(int num, int i)
{return num | (1 << i);
}

num 的第 i 位清零

public int clearBit(int num, int i)
{int mask = ~(1 << i); //形如 1110111return num & mask;
}

num 的第 i 位更新为 v

public int updateBit(int num, int i, int v)
{num = clearBit(num, i); //将 num 的第 i 位清零return num | (v << i);  //将 num 的第 i 位设置为 v
}

补充

原码、反码、补码

  • 原码:一个整数按照绝对值的大小转化成二进制的数

  • 反码:将二进制数按位取反

  • 补码:反码加 1

负数以正数的补码表示

进制表示

  • 2进制用0b表示

  • 8进制用0o表示

  • 10进制用0d表示

  • 16进制用0x表示

相关文章:

  • ❤ Uniapp使用四( 高阶使用配置和各种实现篇)
  • 【CC++】为什么 scanf 函数在读取字符串时不需要用取地址运算符
  • git中合并分支时出现了代码冲突怎么办
  • 可狱可囚的爬虫系列课程 12:在网站中寻找 API 接口(补充)(王者荣耀英雄信息抓取)
  • 【AUTOSAR】RTE 接口类型、应用场景差别及实例讲解
  • docker使用指南疑难杂症
  • Flink启动Yarn Session报错:Couldn‘t deploy Yarn session cluster
  • LeetCode 2744. 最大字符串配对数目
  • 【cmake/makefile】C程序编译过程分析
  • vue3-表单输入绑定
  • 谷达冠楠科技:抖音开网店新手小白可以卖的产品
  • 创新科技引领未来工业革命:人工智能在制造业的应用
  • Pyside6入门教学——编写一个UI界面并显示
  • java连接sql server 2008示例
  • 中小企业股权质押融资(下)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • golang中接口赋值与方法集
  • JAVA SE 6 GC调优笔记
  • Sass 快速入门教程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 记一次和乔布斯合作最难忘的经历
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 优化 Vue 项目编译文件大小
  • 追踪解析 FutureTask 源码
  • 7行Python代码的人脸识别
  • HanLP分词命名实体提取详解
  • mysql面试题分组并合并列
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • (BFS)hdoj2377-Bus Pass
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (java)关于Thread的挂起和恢复
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十)c52学习之旅-定时器实验
  • (十八)SpringBoot之发送QQ邮件
  • (转) ns2/nam与nam实现相关的文件
  • (转)scrum常见工具列表
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net Web项目创建比较不错的参考文章
  • .NET 解决重复提交问题
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET框架设计—常被忽视的C#设计技巧
  • :not(:first-child)和:not(:last-child)的用法
  • @test注解_Spring 自定义注解你了解过吗?
  • [ C++ ] STL---仿函数与priority_queue
  • [.NET 即时通信SignalR] 认识SignalR (一)