-
ios 怎么把负数转换为正数_你竟然不知道整数是怎么在内存中存储的?
2021-01-07 13:16:36原码将一个整数转换成二进制形式,就是其原码。例如short a=10, a的原码就是 0000 0000 0000 1010;更改a的值a=-10,此时a的原码...负数的反码是将原码除 符号位 以外的所有位(数值位)取反,把0变成1,1变成0。例...原码
将一个整数转换成二进制形式,就是其原码。例如
short a=10
, a的原码就是0000 0000 0000 1010
;更改a的值a=-10
,此时a的原码就是1000 0000 0000 1010
。总结:原码就是一个整数本来的二进制形式
反码
正数和负数的反码不一样
正数的反码就是其原码(原码和反码相同);负数的反码是将原码除 符号位 以外的所有位(数值位)取反,把0变成1,1变成0。
例如
short a=10
, a的原码和反码都是0000 0000 0000 1010
; 更改a的值a=-10
,此时a的原码就是1111 1111 1111 0101
。补码
补码的正数和负数的也不一样。
对于正数,它的补码就是其原码(正数三码合一);负数的补码就是其反码加1。
例如
short a=10
, a 的原码、反码、补码都是0000 0000 0000 1010
; 更改a的值a=-10
,此时a的补码就是1111 1111 1111 0110
补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫'补码'。
重点: 在计算机内存中,整数一律采用补码的形式来存储。这意味着当读取整数时还要采用逆向的转换,也就是将补码转换为原码
小结一下:
1、正数的原码、反码和补码都是其本身的二进制
2、负数的反码将原码除 符号位 以外的所有位(数值位)取反,把0变成1,1变成0。补码就是其反码加1。
看到这里是不是有疑问?反码和补码是用来干嘛的?
别急,且让我先做几道题。
假设6和20都是
short
类型的,现在我们要计算 6-18的结果,根据运算规则,它等价于6+(-18)。如果采用原码计算,那么运算过程为
6-18=6+(-18)
= [0000 0000 0000 0110](原) + [1000 0000 0001 0010](原)
= [1000 0000 0001 1000](原)
=-24直接用原码表示整数,让符号位也参与运算,结果显然是不正确的。
于是又开始了探索,不断试错,后来设计出反码。下面来演示反码的运算过程。
6-18=6+(-18)
= [0000 0000 0000 0110](原) + [1000 0000 0001 0010](原)
= [0000 0000 0000 0110](反) + [1111 1111 1110 1101](反)
= [1111 1111 1111 0011](反)
= [1000 0000 0000 1100](原)
= -12计算结果是不是就正确了?这里不妨再思考一下,如果用反码就解决了,那补码为什么还要被设计?什么场景下会需要用到补码?下面我们再来看个栗子。
18-6=18+(-6)
= [0000 0000 0000 0001 0010](反)+[1111 1111 1111 1001](反)
= [1 0000 0000 0000 1011](反)
= [0000 0000 0000 1011](反)
= [0000 0000 0000 1011](原)
= 11最前面那个1在加法运算的过程中进位了,内存溢出被截掉了
真实结果不应该是12吗?怎么通过反码计算的结果是11???
6-18的结果正确,18-6的结果就相差1。是不是按照反码来计算,是不是小的数减去大的数不正确, 大的数减去小的数就不对了?
你们可以按照上面的例子算一下, 然后你们就能发现,大的数减去小的数结果始终相差1。
相差的这个1要进行纠正,但是又不能影响小的数减去大的数的结果,怎么办呢? 聪明的你现在脑海里应该已经想起了我们今天要讲的另外一个主角“补码”。
下面我们来演示一下补码的计算过程:
6-18=6+(18)
= [0000 0000 0000 0110](补) + [1111 1111 1110 1110](补)
= [1111 1111 1111 0100](补)
= [1111 1111 1111 0011](反)
= [1000 0000 0000 1100](原)
= -12
18-6=18+(-6)
= [0000 0000 0001 0010](补) + [1111 1111 1111 1010](补)
= [1 0000 0000 0000 1100](补)
= [0000 0000 0000 1100](补)
= [0000 0000 0000 1100](反)
= [0000 0000 0000 1100](原)
=12惊不惊喜?意不意外?
采用补码的形式正好把相差的1纠正过来,也没有影响小的数减去大的数。
-
剑指offer:把字符串转化为整数
2020-05-08 23:48:05数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 这题是真的坑,目前的数据集明显有问题,用C++...题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0
这题是真的坑,目前的数据集明显有问题,用C++怎么判断都没没发AC。后来看评论区才发现python可以处理那个超过边界的数据。
# -*- coding:utf-8 -*-
class Solution:
def StrToInt(self, s):
# write code here
if s=='':
return 0;
numlist = ['0','1','2','3','4','5','6','7','8','9']
res = 0
index = 1 #遍历字符串时的索引
flag = 1 #符号位flag=1 默认为正数
if s[0] == '-': flag = -1
elif s[0] != '+': index = 0
for c in s[index:]:
if c in numlist:
res = res*10+numlist.index(c)
else:
res = 0
break
return flag*res以上是可以AC的Python代码。
class Solution {
public:
unsigned long int StrToInt(string str)
{
int n = str.size();
if (!n) return 0;
if ((n == 1) && (str[0] == '-' || str[0] == '+'))
return 0;
int symbol = 1;
unsigned long long res = 0;
if (str[0] == '-')symbol = -1;
for (int i = (str[0] == '-' || str[0] == '+') ? 1 : 0; i < n; i++)
{
if (str[i] > '9' || str[i] < '0') return 0;
res = (res << 1) + (res << 3) + (str[i] & 0xf);
if((res>0x7fffffffff)|| (res < (signed int)0x8000000000 && symbol==-1))
return 0;
}
return res*symbol;
}
};C++代码的通过率是85%,有个特例通不过,-2147483649,明明超过long 表示的范围了,有点坑。
-
把字符串转换成整数
2020-07-03 15:27:55数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 题目分析 将字符串转化为数组 第一个元素是否为“+” ...题目描述
链接:题目传送门
来源:牛客网将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空输出描述:
如果是合法的数值表达则返回该数字,否则返回0题目分析
- 将字符串转化为数组
- 第一个元素是否为“+” / “-” 正负号与正常数字的区别处理
- 第一个字母是否为0
- 通过字符数组怎么样判断是否合法并转换为int数组
- 由字符串转换后的数字是否发生溢出
解题代码
public static int StrToInt(String str) { if (str.isEmpty()) return 0; //判断字符串中是否只有+/- if (str.equals("+")||str.equals("-")) return 0; int flag=0; //字符串转化为字符数组 char[] chars = str.toCharArray(); //创建相同长度的数组存储数字 int[] tmp = new int[chars.length]; //判断第一个字符是否为+/-,如果为则房子tmp中下标为0的位置,并且将 //flag置为1.通过此方法进行动态判断第一个字母。 if(chars[0]=='+'||chars[0]=='-'){ tmp[0]=chars[0]; flag=1; } //判断字符数组是否为0-9,并转换为数组存入tmp中 for (int i = flag; i < chars.length; i++) { int a = (int)chars[i]; if (a >= 48 && a <= 57) { int b = (int) chars[i]; tmp[i] =b-48; } else return 0; } //对数组数组进行重组为数字 int s=tmp[flag]; for (int i = flag+1; i <tmp.length ; i++) { s=s*10+tmp[i]; } //通过第一个字符的类型判断输出结果 if(tmp[0]=='+') return s; else if(tmp[0]=='-') return -s; else return s; }
此解法中没有溢出情况的判断,提供两个关于本题的溢出判断思路
- 通过数字数组与最后结果的进行比对判断,如果溢出两者每位上的数组不会相同
- 在程序中使用long类型,判断之后转化为int
- 正常的溢出判断方法后续学会补充
-
Java【面试题67】: 把字符串转换成整数
2019-04-12 20:40:59数值为0或者字符串不是一个合法输入的数值则返回0 思路: 需要注意的点: 1.只输入一个符号时怎么处理 2.输入不是数字的其他符号类型时 3.输入的字符串大于整型范围时,考虑溢出 3.空串或者长度为0时 字符...题目:把字符串转换成整数
要求不能使用字符串转整数的库函数。数值为0或者字符串不是一个合法输入的数值则返回0
思路:
需要注意的点:
1.只输入一个符号时怎么处理
2.输入不是数字的其他符号类型时
3.输入的字符串大于整型范围时,考虑溢出
3.空串或者长度为0时- 字符’0’对应的ASCII码值是48(转化为int类型);
- 字符’9’对应的ASCII码值是57 (48+10-1=57);
package jianZhiOffer; /* * 把字符串转换成整数 * 要求不能使用字符串转整数的库函数。数值为0或者字符串不是一个合法输入的数值则返回0 */ public class Demo67 { public static void main(String[] args) { System.out.println(parseStringToInt("-")); System.out.println(parseStringToInt("-456692")); System.out.println(parseStringToInt("")); } public static int parseStringToInt(String str) { int len = str.length(); if(len==0 || str=="") return 0; if((str.charAt(0)=='+'||str.charAt(0)=='-')&& str.length()==1) { return 0; } int sum=0; int fuhao=1; //当第一位为正或者无符号时,置符号位为1 if(str.charAt(0)=='-') fuhao = -1; if(str.charAt(0)=='+' || str.charAt(0)=='-') str = str.substring(1,str.length()); char[] a = str.toCharArray(); for(int i=0;i<a.length;i++) { if(a[i]<48 || a[i]>57) return 0; sum = sum*10+a[i]-48; } sum = sum*fuhao; if(sum<Integer.MIN_VALUE || sum>Integer.MAX_VALUE) return 0; else return sum; } }
-
7. 整数反转
2020-07-22 15:29:11假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ -2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 解题思路 思路一:数学 首先我们想一下,怎么去反转一个整数? 用栈? ... -
c++链表大整数求和,我的结果是无限循环,知道是Add函数错了,但是不知道怎么改
2016-11-06 05:44:40m++)//将字符串转换为整数 a[m]=i[m]-48; for(int n=0;n;n++) b[n]=j[n]-48; LinkList A(a,lena);//构造A链表 LinkList B(b,lenb);//构造B链表 LinkList C; C=Add(A,B); A.Reserve(A.first);//A链表逆置 A.... -
java 整数的立方和_java中整数和字符串间的转换方法
2021-02-26 11:07:47如果让您亲自动手来来写一个Integer中的toString()方法和parseInt()方法,您会怎么写?请您先动手写toString()方法。...然后要把这个Integer数值转化为一个字符数组,所以也要有一个getChars()的private方法... -
每日算法题--整数反转(简单)
2020-12-10 22:13:22假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2的31次方, 2的31次方 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 题解: 首先进行数字反转,我们第一时间想的肯定是,怎么把数字... -
【LeetCode - Java】7. 整数反转 (简单)
2020-12-24 15:32:09简单直接,第一反应想到的便是把整型数据转换为字符数组,使用for循环把该数组倒置后再转换为整形数据,判断其是否溢出,倒置简单,但是怎么判断该数是否溢出呢?可以把该数与最大整型数进行比较,但是,若转换时... -
jdk源码--整数和字符串间的转换
2012-02-10 15:57:56如果让您亲自动手来来写一个Integer中的toString()方法和parseInt()方法,您会怎么写? 请您先动手写toString()方法。 ...2.然后要把这个Integer数值转化为一个字符数组,所以也要有一个getChars() -
求N+1 个数字中缺少的那个数值
2012-10-17 20:04:19也就是说,如果是排序好放到大小为N的数组中,其实最大的整数应该是N+1。你的任务和算法是找出其中缺失的整数。如果是排序好的,怎么做?如果是无序的,又该如何做?时间复杂度各是什么?你能想到的最优算法是什么?... -
string类型数字怎么相加_JavaScript基本数据类型
2020-12-03 08:13:24由于保存浮点数值的内存空间是保存整数值的两倍,所以js会不失时机的把浮点数转换为整数。小数点后面没有数值或者1.0就会被保存成整数。2.特殊的数字类型NaN1、表示不是数字,但是其实它是一个特殊的数字(NaN:Not ... -
access四舍五入取整round_access把浮点字段取整是什么函数
2021-02-06 11:34:32一般在分享平均值的时候,都会有很多小数点,如何利用excel中的函数把他在ROUND(AVERAGE(包含数值的单元格),0),其中0为要得到的数值的小数位数。Access中怎么取整数?access中取整数有两个函数: 壁虎有一条会断的... -
位操作符-数字如何转化为二进制并进行操作
2017-08-06 17:36:58ECMAScript语言中的位操作符,所有的数值都是以IEEE-754 64位格式存储,但是位操作符不直接存储64位的储存格式,得把数值64转化为32位的整数,执行操作,执行后再将结果转化为64位。32位中的前31位用于表示整数的值... -
程序员升级打怪第1关:怎么快速找到数组中两个数相加等于目标值?
2021-01-31 15:41:13大家好 我是“@不会飞的小飞驴” 1 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 ...把数值作为key,下标作为value,遍历数组,设置一个map,判断map是否含有当前的目标值-当前 -
python怎么读取列表-Python如何获取列表(List)的中位数
2020-11-01 12:27:26前言中位数是一个可将数值集合划分为相等的上下两部分的一个数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的... -
JavaScript Math.round()的用法以及怎么保留指定小数
2020-08-19 22:21:51把给定的值四舍五入为最接近的整数 示例: var xx= 20.5; console.log(Math.round(xx, xx)) // 21 var xx= 20.49; console.log(Math.round(xx)) // 20 var xx= -20.5; var xx= -20.55; console.log(Math.round -
python怎么读取列表-详解Python如何获取列表(List)的中位数
2020-11-01 12:28:06前言中位数是一个可将数值集合划分为相等的上下两部分的一个数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2个数据的算术平均值就是列表数据的... -
怎么修改下面的代码,关于两数求和
2016-01-10 07:54:21=',') //把字符转化为整数 { k+=(a[i]-'0')*sum(l); l++; } if(a[i]==','||i==w) { currptr=new LinkNode; //把整数存到双向循环链表中 currptr->data=k; currptr->next=head0; currptr->prev=... -
一道词典算法题,讲单词隐射为词典中的顺序
2016-08-09 16:08:25反过来给出一个整数,怎么做反向映射? 解法思路,实际单词上就是一种26进制的的表示。 只不过最终在计算值的时候每个位的最小是1 而非 0. 可以把A 隐射成0, Z 隐射成 25 但是注意计算数值的时 -
LeetCode ...只有熟练掌握基础的数据结构与算法,才能对复杂问题迎刃有余。...这是我将我的所有公开的算法资料整理的一个电子书,全部题目信息中文化,以前会有一些英文描述,...1521. 找到最接近目标值的函数值 ...
-
光圈值详解
2019-02-17 20:51:01为啥光圈的数值都这么怪,什么1.4、2、2.8、4、5.6、8啥的,看上去既没有规律,还有很多都是小数,直接用1、2、4、8这种整数来表达多好啊。在研究之后,终于发现了光圈数值的来源。 首先,每一支镜头都有最大光圈,... -
数学期望的一步算法(伤害计算科大讯飞杯)
2020-05-12 17:03:06当我们要求的是从x个数值中随机挑选n个数值,且这x个数值为1->x的时候,这个时候求数学期望不需要按上面的解法,直接E(a)=n*(x+1)/2 2、伤害计算题目及解法 原题链接 来源:牛客网 题目描述 勇士菜哭武获得了一把... -
Excel 划分各分数段并统计各分数段的人数
2020-04-08 21:44:10每当考试阅卷结束后,老师们都要对考试成绩进行统计,而统计各分数段人数是其中必不可少的一部分。那么怎么快速对各分数段人数进行统计呢?...FLOOR 函数参数用来将数值向下舍入为最接近的整数,或者最为... -
Excel公式大全操作应用实例(史上最全)
2018-03-06 21:09:38取整数函数 数值取整 求余数的函数 四舍五入公式 对数字进行四舍五入 如何实现“见分进元” 四舍五入 如何四舍五入取两位小数 根据给定的位数,四舍五入指定的数值 四舍六入 如何实现2舍3入 怎么设置单元格以千元四... -
EXCEL函数公式集
2010-03-16 03:26:38取整数函数 数值取整 求余数的函数 四舍五入公式 对数字进行四舍五入 如何实现“见分进元” 四舍五入 如何四舍五入取两位小数 根据给定的位数,四舍五入指定的数值 四舍六入 如何实现2舍3入 怎么设置单元格以千元四... -
你必须知道的495个C语言问题
2015-10-16 14:14:28然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候... -
C语言FAQ 常见问题列表
2010-10-28 16:41:29o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用非零空指针吗, 或者不同类型用不同的表达? o 6.15 运行时的 ``空指针赋值" 错误是什么意思... -
你必须知道的495个C语言问题(中文高清版)
2013-03-20 13:28:28然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char*p1,p2;我在使用p2的时候...