首页 > 其他分享 >查缺补漏——位运算

查缺补漏——位运算

时间:2024-08-14 19:41:56浏览次数:10  
标签:补漏 反码 运算 负数 按位 查缺 正数 原码

编码方式

原码:第一位是符号位,后面是数字位。符号位 \(0\) 为正数,\(1\) 位负数

like tihs:
\(10000010\),这里表示的十进制数字就是 \(-2\),第一位 \(1\) 是符号位。


反码:
分两种情况:
1.正数的反码就等于正数的原码。
2.负数的反码就等雨负数的原码除了符号位,其余的位按位取反。

like this:
原码:\(00000010\) 反码:\(00000010\) (正数的反码就等于正数的原码。)
原码:\(10000010\) 反码:\(11111101\) (负数的反码就等于负数的原码除了符号位,其余的位按位取反。)


补码:
分两种情况:
1.正数的补码就等于正数的原码。
2.负数的补码就等于负数的原码除了符号位,其余按位取反之后+1。

like this:
原码:\(00000010\) 补码:\(00000010\) (正数的补码就等于正数的原码。)
原码:\(10000010\) 反码:\(11111110\) (负数的补码就等于负数的原码除了符号位,其余的位按位取反之后+1。)


Q1:为什么计算机运算用补码?

A:最近观看了b站上的一个叫“寒武纪魔道电子”的老师讲计算机运算器的。老师讲解是这样的:
因为一个字节的运算是会自然溢出的。就是说运算中超过最高位的数字可以直接舍弃。所以说,一个字节,不停给它+1,转回十进制表达的数字是循环的。

循环给我们的启示就是循环的数字相同的一定是在模循环节的长度的意义下是同余的。补码可以使用加法的电路进行减法而不会出错。

位运算

位运算的意义:位运算可以用来优化算法。位运算的速度比一般的运算快很多。在状态压缩时我们处理数据要使用位运算。

按位取反 ~

按位取反的符号是 ~。是一个数字的运算。如果这一位是 \(1\) 就变成 \(0\),是 \(0\) 就变成 \(1\)。
具体如下:

1010001011   原数
0101110101   按位取反之后的结果

按位与 &

按位与是两个数之间的运算,这两个数字在这一位上都位 \(1\),则运算后的结果就是 \(1\),否则就结果就是 \(0\)。
具体如下:

1001011011   原数a
0101110101   原数b
0001010001   按位与之后的结果

按位或 |

按位或是两个数之间的运算,只要这两个数字在这一位有一个为 \(1\),则运算后的结果就是 \(1\),否则就结果就是 \(0\)。
具体如下:

1001011011   原数a
0101110101   原数b
1101111111   按位或之后的结果

异或 ^

异或是两个数之间的运算,在这一位上,若相同则为 \(0\),不同则为 \(0\)。
具体如下:

0001011011   原数a
0101110101   原数b
0100101110   异或之后的结果

异或运算经常直接出现在算法题目当中,我们需要熟知它的性质:

1.异或满足交换律。
2.异或满足结合律。
3.根据异或的运算法则,异或有这样的性质:
    一) x^x=0
	二) x^0=0
根据这两条,可以推出异或操作是可逆的


其余的性质都可以根据这三条进行推导,更加详细的性质就不再列举。

右移 >>

左移和右移是极其有用的,一定要学好。在判断状压dp的状态时有重要的作用。

把一个数字的二进制位全部右移若干位,最低位抛弃。这时候左边要补位。如果这是一个正数的话,每右移一位,补一个 \(0\)。如果这个数是负数,每右移一位,左边补一个 \(1\)。

66 >> 3
00111110
00011111 >>1
00001111 >>2
00000111 >>3
等于7

左移 <<

把一个数字的二进制位全部左移若干位,最高位抛弃。这时候右边要补位。每左移一位,右边补一个 \(0\)。

12<<3
00001100
00011000 >>1
00110000 >>2
01100000 >>3
等于96

解语:
读者在读完之后可以去力扣上练一练,算法OJ上一般没有这种比较全的纯位运算练习。

作业:
1.使用位运算交换两个数的值(不使用中转数组)。
2.使用位运算计算一个数字的二进制位上的 \(1\) 出现的地方。

如果觉得好,就点个

标签:补漏,反码,运算,负数,按位,查缺,正数,原码
From: https://www.cnblogs.com/blogs-for-Ruan-ji/p/18359628

相关文章

  • C++赋值运算符
    赋值运算符 = 用于将一个值赋给一个变量。对于自定义类型,如类和结构体,你可以重载赋值运算符以定义如何将一个对象的值赋给另一个对象。默认赋值运算符对于类类型,默认的赋值运算符会执行成员逐一赋值(member-wisecopy)。这意味着对于两个对象a和b,表达式a=b;将每个成员从b复制......
  • 运算符
    按照功能分类算术运算符加法(+):两数相加。减法(-):两数相减。乘法(*):两数相乘。除法(/):两数相除(注意:当两边都是整型时,结果为整型且向下取整)。取模(%):两数取余(两个数必须是整数)。自增自减运算符自增(++):将变量的值增加1。分为前缀自增(++i)和后缀自增(i++),区别在于返回值不同。自减(--......
  • Java 运算符(详解)
    文章目录一、简介二、算术运算符三、自增自减运算符四、关系运算符五、逻辑运算符六、位运算符六、赋值运算符七、条件运算符八、字符串连接符九、运算符优先级一、简介在Java中,运算符是用来对数据进行操作和处理的符号,这些符号能使得Java程序进行各种数学计算、......
  • 变量与常量与运算符
    变量可以变化的量变量命名规范变量、方法、类名:见名知意类成员名:驼峰原则,除第一个单词意外,后面的单词首字母大写。局部变量:首字母小写和驼峰原则。publicclassDemo6{publicstaticvoidmain(String[]args){//inta,b,c;不建议//inta=......
  • vue使用JavaScript运算符
    第一:加法运算符{{变量+n}}<p>num参与运算{{num+12}}</p>letvm=newVue({el:"#app",data:{num:101,isOK:true,message:'你......
  • C语言 08 运算符
    基本运算符基本运算符包含常用的一些操作,常用的有:加法运算符:+减法运算符:-乘法运算符:*除法运算符:/取模运算符:%赋值运算符:=先来看加法运算,这个就和数学中的是一样的了:#include<stdio.h>intmain(){inta=10,b=5;printf("%d",a+b);}15当然也......
  • 自学Linux第十六天:结构体 、 共用体 枚举 位运算
    结构体、共用体枚举位运算结构体结果体类型——用来描述复杂数据的一种数据类型构造类型用户自定义类型结构体描述一个结构体语法:struct:结构体类型名{成员列表}struct关键字   表示是在构造一个结构体的类型结构体名   用来描述结构体这个类型的......
  • 自学嵌入式第十七天:共用体和位运算
    qsort() voidqsort(      void*base,  //要排序的数组的首地址       size_tnmemb, //数组元素的个数        size_tsize, //单个元素的大小       int(*compar)(constvoid*,constvoid*)//比较函数......
  • 【C语言】简单位运算
    判断奇偶:奇:(x&1)==1⟺(x&1)!=0偶:(x&1)==0⟺(x&1)!=1乘(或除)以2的幂次:x>>n⟺x/2^nx<<n⟺x*2^n去除最后一位1:x&(x-1)得到最后一位1:x&-x判断2的幂次:x&(x-1)==0交换两个数:a^=b;b^=a;a^=b;交换符号:......
  • C语言问答进阶--4、基本运算符
    赋值运算符A:下面将介绍赋值操作符。它的符号就是 = .A:赋值操作符,就是把一个值赋值给左边的变量。正如以前说的形如a=1之类的表达就是赋值运算符的具体应用。也许有的人在编写代码的时候写过这种代码:#include "iostream.h"int main(){    int x;    1=x;......