[剑指offer]面试题第[65]题[JAVA][不用加减乘除做加法][位运算]

【问题描述】[简单]

在这里插入图片描述

【解答思路】

在这里插入图片描述

1. 位运算

时间复杂度:O(1) 空间复杂度:O(1)
在这里插入图片描述

public int add(int a, int b) {while(b != 0) { // 当进位为 0 时跳出int c = (a & b) << 1;  // c = 进位a ^= b; // a = 非进位和b = c; // b = 进位}return a;}

【总结】

1. 位运算

异或运算(^)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
5 ^ 1 = 0101 ^ 0001 = 0100 = 4
5 ^ 3 = 0101 ^ 0011 = 0110 = 6
用法
翻转指定位 对应位异或1
X=10101110,使X低4位翻转,用X ^0000 1111 = 1010 0001即可得到。
2.两个数是否相等 ==0
5 ^ 5 = 0101 ^ 0101 = 0000 = 0

与运算(&)
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
5 & 1 = 0101 & 0001 = 0001 = 1
5 & 2 = 0101 & 0010 = 0000 = 0
用法
取指定位 对应位与1
设X=10101110,
取X的低4位,用 X & 0000 1111 = 00001110 即可得到;

或运算(|)
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1
用法:
指定位置置1 对应位或1
将X=10100000的低4位置1 ,用X | 0000 1111 = 1010 1111即可得到

取反运算(~)
运算规则:~1=0; ~0=1;
即:对一个二进制数按位取反,即将0变1,1变0

带符号左移运算(<<)
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2(右边补0)
3 << 1 = 0011 <<1 = 0110 = 6
带符号右移运算(>>)
正数操作数每右移一位,相当于该数除以2
(左补0 or 补1得看被移数是正还是负)
5 >> 1 = 0101 >> 1 = 0010 = 2
5 >> 2 = 0101 >> 2 = 0001 = 1
-14 >> 2 = 11110010 >> 2 = 11111100 = -4
无符号右移运算(>>>)
5 >>> 1 = 0101 >>> 1 = 0010 = 2
-14 >>>2 =11111111 11111111 1111111111110010 >>>2 = 00111111 11111111 1111111111111100 = 1073741820
移位总结

  • 正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。
  • 负数的右移,就是补码高位补1,然后按位取反加1即可。
2. 位运算 判相等异或^ 取位与&1 置位或|1
3.扩展知识

Python 负数的存储
在这里插入图片描述

print(hex(1)) # = 0x1 补码
print(hex(-1)) # = -0x1 负号 + 原码 ( Python 特色,Java 会直接输出补码)print(hex(1 & 0xffffffff)) # = 0x1 正数补码
print(hex(-1 & 0xffffffff)) # = 0xffffffff 负数补码print(-1 & 0xffffffff) # = 4294967295 ( Python 将其认为正数)

作者:jyd
转载链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/mian-shi-ti-65-bu-yong-jia-jian-cheng-chu-zuo-ji-7/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2018蓝桥模拟赛·天上的星星 暴力|二维树状数组

在一个星光摧残的夜晚&#xff0c;蒜头君一颗一颗的数这天上的星星。蒜头君给在天上巧妙的画了一个直角坐标系&#xff0c;让所有的星星都分布在第一象。天上有 nn 颗星星&#xff0c;他能知道每一颗星星的坐标和亮度。现在&#xff0c;蒜头君问自己 qq 次&#xff0c;每次他问…

VS2010主题设置及插件推荐

本文主要写了个人使用 VS2010 的一些配置及实用插件&#xff0c;从而打造一个符合个人风格的开发环境。 基础设置 安装 Visual Assist X 在 VS2010 中若不安装 Visual Assist X 这个插件&#xff0c;直接开发 C 相关的项目将是非常痛苦的事情。默认环境没有对代码的不同部分进行…

[Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

【问题描述】[中等] 【解答思路】 1. DFS 深度优先遍历 时间复杂度&#xff1a;O(NM) 空间复杂度&#xff1a;O(N) class Solution {private static final int UNCOLORED 0;private static final int RED 1;private static final int GREEN 2;private int[] color;privat…

[剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

【问题描述】[中等] 235/68-1 搜索二叉树 236/68-2 二叉树 【解答思路】 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下。 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, Tr…

Docker 查看镜像信息

Docker 查看镜像信息 原文:Docker 查看镜像信息文章首发个人网站&#xff1a; https://www.exception.site/docker/docker-look-up-image-info 本文中&#xff0c;我们将需要学习 Docker 如何查看镜像信息&#xff1f; 一、images 命令列出镜像 通过使用如下两个命令&#xff0…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题

这篇是密码学52件事中第7篇.我们只要把问题集中在BPP复杂类问题. 目前为止,我们已经介绍了一些复杂类: P 是一类能在多项式时间内被可确定的图灵机判定的问题.NP是一类能在多项式时间内被非确定的图灵机判定的问题.BPP是一类在多项式时间内被概率图灵机解出的问题,并且对所有…

73 forward动作

定义一个logind的jsp页面 <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert tit…

Linux系统开发之路 - 下

5、Ubuntu安装好之后&#xff0c;就可以进行开发环境的搭建。&#xff08;坚持看完有彩蛋&#xff0c;(>--..--<).jpg&#xff09;。 1&#xff09;首先安装Nodejs和Npm。 打开浏览器输入nodejs.org&#xff0c;进入页面会提示下载&#xff0c;如下图&#xff0c;选择LTS…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第8篇]交互式的定义如何帮助计算和IP类问题是什么

这是系列中的第8篇&#xff0c;我们主要讨论计算中交互作用的用处和IP类问题是什么. 什么是证明 经典的证明 交互式证明系统 [1] http://dl.acm.org/citation.cfm?id63434 [2] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642 [3] h…

线段树之扫描线思路

运用线段树扫描线方式可以解决经典的求矩形面积交问题以HDU_1542 Atlantis 题为例 线段树和扫描线是这么结合的线段树统计的是有效区间段的长度 也就是扫描线 当前扫描到的区间段是哪一个 什么意思 比如当前在哪一个段扫描 那么线段树中的t[1]中的len就是多长 线段树一般…

74 param动作

定义一个logind的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title h…

Unknown column 'user_uid' in 'field list' sql错误解决过程

在idea中运行一直有错&#xff0c;找了好多个地方都找不到&#xff0c;以为是我的字段名字写错了&#xff0c;然而都是对的。 把错误的这个字段删了再打一遍就好了&#xff0c; 转载于:https://www.cnblogs.com/zxrxzw/p/10630164.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第9篇]香农对熵和信息的定义是什么?

这是计算机理论的最后一篇.我们讨论信息理论的基础概念,什么是香农定义的熵和信息. 熵 熵与确定性成反比 信息 密码学实例 [1] Thomas M. Cover and Joy A. Thomas. Elements of Information Theory ​ 2nd Edition. Wiley-Interscience, 2 edition, July 2006. [2] S. Vaj…

数据结构:(5)算法分析基础

算法时间复杂度分析 算法空间复杂度分析

[Leetcode][第35题][JAVA][搜索插入位置][二分法]

【问题描述】[中等] 【解答思路】 二分法 时间复杂度&#xff1a;O(LogN) 空间复杂度&#xff1a;O(1) public class Solution {public int searchInsert(int[] nums, int target) {int len nums.length;if (len 0) {return 0;}// 特判if (nums[len - 1] < target) {re…

数据结构:(6)其他情况的算法分析

最好&#xff0c;最坏,平均复杂度分析 递归算法的时间复杂度分析

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第10篇]RSA和强RSA问题有什么区别

这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于这样的假设,某些数学问题难以在有限的时间内解决.让我们看公钥(非对称)密码学,这也是这篇文章中我们使用的一个假设----**单向函数(O…

第十三期:你所了解的javascript?

在介绍JavaScript之前&#xff0c;首先让我们来简单了解一下脚本语言。大家知道&#xff0c;HTML通常用于格式化和链接文本&#xff0c;各种编程语言通常用于向机器发出一系列复杂的指令&#xff0c;而脚本语言是介于HTML和C、Java等编程语言之间的语言。脚本语言是一种简单的语…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第12篇]椭圆曲线上的群理论是什么

这是系列中的第12篇,我们继续数学背景的部分,通过介绍椭圆曲线的群理论… 椭圆曲线群定律是一种在一组椭圆曲线有理点中定义的二元操作来形成一个群的方法.现在,让我们看看到底什么意思,和这个东西怎么用 椭圆曲线和它的有理点 在椭圆曲线中加入群理论 这就是全部了吗 这和密…