计算机不会做加法(位运算)

之前还有一个计算机的原码反码补码,这些比较简单 ,大家可以自行了解

不过要掌握一个思路

拿到一个二进制数据时    拿到数据(二进制)———>  搞清楚时以什么方式编码(视频还是txt)——————>根据不用方式的编码规则编码

一. 计算机的运算--(位运算)

二.为什么要学习位运算??

三.位运算

1.与运算

2.或运算

3.异或运算

4.非运算(取反)

5.左移动(相对简单)

6.右移

在汇编里面右移动 补0就用shr

右移动 补符号位就用sar

在c语言里面补0和补符号位用的都是>>

c语言会根据unsigned和int来判断你是有符号还是无符号数,然后决定补0还是

unsigned无符号

int计算机就是默认有符号

四.通过位运算实现四则运算

1. 比如4+5的运算过程

可以发现 在没有进位的情况下,加法和异或的结果一致

所以当计算机运算的时候,先 异或  在判断有没有 进位  再 异或

与运算是为了判断哪个位置出现进位这个位置出现进位

异或并没有将进位考虑过去

所以要把进位的结果和异或的结果再相加,注意的是 我们再次加的时候要把0000 0100 左移1位(因为有一个进位)

再判断是否有进位 与一下看是否为0 没进位了就是最终结果

整体过程

2.

4-5(其实也就是加法)

也就是4+(-5)负数的运算是以补码形式进行的

先异或 完事再与一下看看有没有进位 没有就完事了

原文地址:https://www.cnblogs.com/cat47/p/12238430.html

时间: 2024-11-05 14:48:10

计算机不会做加法(位运算)的相关文章

剑指offer-面试题65-不用加减乘除做加法-位运算

/* 题目: 在不使用加减乘除的前提下,计算两个整数之和. 思路: 不能使用加减乘除则只能考虑位运算. x=num1^num2,则为抹掉进位的结果. y=num1&num2,为只有进位的结果. (y<<1)&x,直到不产生进位. */ #include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> using

bzoj5108 [CodePlus2017]可做题 位运算dp+离散

[CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 87  Solved: 63[Submit][Status][Discuss] Description qmqmqm希望给sublinekelzrip出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需 要计算其异或前缀和bi,满足条件b1=a1,bi=bi?1 xor ai(i≥2).但是由于数据生成器出现了问题,他生成的序列a 的长度特

007计算机不会做加法

与: 有一个不为1就不为1 或: 有一个为1就为1 异或: 相同为0不同为1 非: 0就是1,1就是0 (单目运算) 左移: 高位丢弃,低位补0 shl(<<)1101 1000 左移两位:0110 0000 右移: 各二进位全部右移若干位,低位丢弃,高位补0或者补符号位 shr 1101 0101 ==> 0011 0101 sar 1101 0101 ==> 1111 0101 原文地址:https://www.cnblogs.com/xeclass/p/12585181.ht

位运算和关于两个数交换的多种方法

我们知道,位运算在计算中有着广泛的应用. 在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中. 以下我们就来介绍一下位运算. 1.左移运算<<  左移右移都是移动二进制数 0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0) 0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位 0000-0000 0000-0000

位运算+枚举

位运算http://c.biancheng.net/cpp/html/101.html 在很多情况下(比如翻棋子)在搜索时涉及大量枚举往往导致超时,位运算则很好地解决了这个问题,方便又快捷 HDU  1882   Strange Billboard http://acm.hdu.edu.cn/showproblem.php?pid=1882 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot

深入理解位运算及其用法

^ 参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1.即: 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0按位异或的3个特点:(1) 0^0=0,0^1=1 0异或任何数=任何数(2) 1^0=1,1^1=0 1异或任何数-任何数取反(3) 任何数异或自己=把自己置0按位异或的几个常见用途:(1) 使某些特定的位翻转 例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算. 10100001^00000110 = 101

求集合中选一个数与当前值进行位运算的max

求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需要给定\(01/10,00,11\)的关系,总共\(8\)种. 如果是暴力的话,我们的方法有两种, 第一种是比较喜闻乐见的, 我们对于当前数\(x\),暴力计算所有存在的数\(a_i\)中,\(x\oplus a_i\)的最大值,这样的复杂度是\(O(2^{16})\)的. 另外一种也是不难考虑到的

[leetcode] Sum of Two Integers--用位运算实现加法运算

问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. 分析: 这里要求我们不能用加法.减法等运算符来实现加法运算.这里应该使用位运算来实现加法运算,实际上,这也是计算机CPU内部实现加法运算的方案. x XOR y真值表: x y output 0 0 0 0 1 1

Java千百问_03基本的语法(005)_二进制是如何做位运算的

点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种的运算符都有哪些 大部分运算流程都是先将整数转换为二进制.然后进行对应二进制操作.常见的操作有例如以下几种:以下我们具体说明,运算符的优先级看这里:java运算符的优先级是如何的 1.按位与 and两个二进制数进行按位与操作:同样位的两个数字都为1.则为1:若有一个不为1,则为0. 比如:00101