一 原码、反码和补码

1.1原码

原码就是将10进制数,转化为2进制码,比如:

8:00001000

-8: 10001000

最高位表示符号位。

1.2 反码

反码:如果是正数,即最高位是0,则反码是原码自己;如果是负数,即最高位符号位是1,则符号位保持不变,其余位取反。比如:

8的原码:00001000

8的反码:00001000

-8的原码:10001000

-8的反码:11110111

1.3 补码

有时候,按照我们用反码表示一些数的时候,然后进行运算会有问题:

第一:0有两种二进制表示,即+0和-0

比如8+(-8) = 0

但是使用原码计算:

00001000 + 10001000 = 1001000

转化为10进制就是-16,明显不是我们的结果。

使用反码计算:

00001000+11110111 = 11111111

然后再取反,即10000000,转化为二进制是-0

所以引入了补码,对于补码,最高位还是符号位,对于正数而言,其余位置不变;对于负数而言,除最高位,其余位置按位取反,末位加1.

比如:

8的原码:00001000

8的反码:00001000

8的补码:00001000

-8的原码:10001000

-8的反码:11110111

-8的补码:11110111+00000001= 11111000

然后在计算8+(-8)

00001000+11111000 = 00000000

转化为10进制就是0

二 位运算符

2.1 & 与运算

被比较两个数,计算二进制原码,然后按位比较,如果都是1,结果为1,如果都是0或者1个是0,另一个是1,则该位为0。即所谓的真真为真,真假为假,假真为假,假假为假

比如11&15,他们二进制是1011和 1111

1011

1111

结果1011,所以是11

比如128和129,他们二进制是10000000 和 10000001 00001101

10000000

10000001

结果=10000000 所以结果是128

2.2 | 或运算
被比较两数转化为二进制,然后按位比较,如果都是1 或者有一个是0,另外一个1结果都为1;如果都是0则该位是0. 即所谓的真真为真,真假为真,假真为真,假假为假

我们计算11|15

1011

1111

=1111所以结果是15

我们计算128和129

10000000

10000001

=10000001结果为129

2.3 ^ 异或运算

转换成二进制按位进行比较,如果一个是1,一个是0,则为真,该位是1;否则都是1或者都是0,则表示为假,该位是0。即所谓的真真为假,假假为假,真假为真,假真为真

比如11 ^ 15,即 1011 ^ 1111 = 0100

2.4 ~非运算

转化为2进制,然后按位取反。比如11举例子:

~11: 即对1011取反,即0100

三 位移运算

<<左位移

向左移动n位,然后在低位补0.

16<<3

0000 0000 0000 0000 0000 0000 0001 0000红色为移掉部分

结果0000 0000 0000 0000 0000 0000 1000 0000 红色为补齐

结果:128

>> 右位移(有符号)

向右移动n位,在高位补0,如果为负数,在高位补1

16>>3

0000 0000 0000 0000 0000 0000 0001 0000 红色为移掉部分

0000000 0000 0000 0000 0000 0000 0001 0 红色为补齐部分

结果为2

-16>>3

0000 0000 0000 0000 0000 0000 0001 0000

去反

1111 1111 1111 1111 1111 1111 1110 1111

加1

1111 1111 1111 1111 1111 1111 1111 0000

然后右移3位

1111 1111 1111 1111 1111 1111 1111 0000

1111 1111 1111 1111 1111 1111 1111 1110

>>>无符号右位移

向右移动n位,在高位补0,不考虑正负符号

16>>>3 结果为2

-16>>>3

1111 1111 1111 1111 1111 1111 1111 0000

0001 1111 1111 1111 1111 1111 1111 1110

假设A = 25,B =44;

那么二进制总共8位,每一位对应着一个值,从最低位到最高位依次是1,2,4,8,16,32,64,128,所以我们的每一个数组都可以根据这个计算出来

A = 25, 16 < 25 < 32,所以16位置肯定是1,现在还剩25-16 = 9, 8< 9 <16, 所以8的位置肯定是1 ,最后9-8 = 1, 1的话刚好是最低位的位置

结果就是

128 64 32 16 8 4 2 1

0     0   0   1  1 0 0 1

B = 44, <32<44<64,所以32的位置上是1,44-32=12 < 16 所以 8的位置1,12-8  = 4 那么4的位置就是1,最终二进制结果就是

128 64 32 16 8 4 2 1

0     0   1   0  1 1 0 0

2、位移运算

  1)正数的右移:如10 >> 2,左边自动补0,右边移出位舍弃,即00001010 --> 00000010,结果是2,实际的意思是,每向右移动一位,就相当于除以2,小数舍弃,即10/2/2=2.5,舍弃小数,结果就是2。

  2)正数的左移:如10 << 2,右边自动补0,左边移出位舍弃,即00001010 --> 00101000,结果是40,实际的意思是,每向左移动一位,就相当于乘以2,即10*2*2=40。

  3)负数的右移:如-2 >> 2,由于二进制的首位为符号位,负数在右移过程中,为了保持负数的特性,所以左边会自动补1而不是0,即11111110--> 11111111,结果为-1。

  4)负数的左移:负数的左移与正数的左移一致,在右边自动补0。

5)无符号的右移:如-2 >>> 2,对于负数的右移在左边自动补1,但是对于无符号的右移,左边是自动补0,即11111110 -- > 00111111,结果为63。所谓的无符号右移,就是不考虑正数还是负数,左边一律补0。

那么我们现在计算 A & B 和 A|B 和 A^B

第一种 A & B

0 0 0 1 1 0 0 1

0 0 1 0 1 1 0 0

我们知道& 表示比较的双方都需要为true

所以0&0 = 0, 0& 1=0 1&0 =0 1 & 1 =1

所以结果就是

0 0 0 0 1 0 0 0 转化为10进制就是8

第二种 A|B 只要有一个是true,结果为true

0|0 = 0 1|0 =1 0|1 =1 1|1 =1

0 0 0 1 1 0 0 1

0 0 1 0 1 1 0 0

0 0 1 1 1 1 0 1 转化为10进制就是61

第三种异或A^B

异或表示有一个为真且有一个为假才算真,否则为假也就是不能同时为真或者同时为假

0 0 0 1 1 0 0 1

0 0 1 0 1 1 0 0

0 0 1 1 0 1 0 1 结果为0*128+0*64 +1*32 +1*16+0*8 + 1*4 + 0*2 + 1*1= 53

四 位移存储多个值

有时候,我们声明一个变量,比如short,int,long等,他们是16,32,和64位。那我们可能只是存储很小的数,那么空间就浪费了。

所以我们可以高低位存储2个值,以short举例子,它是2个字节,占用16位,我们可以存储一个数a到低位,存储一个数b到高位,如何存储呢?

因为数a需要存储到低位,所以不用动;而数b需要存储到高位,所以,需要考虑你要存储的数最多占几位,如果你在低位只需要4位就够用了,那么高位由12位可以用,那你最多可以向左移12位,简单起见,我们就假设低位8位,高位占8位。即你的数据如果8位了,我们可以向右移动8位,这就存储到了高位,再加上低位的数,即我们就可以保存2个数了。

比如我现在2想存在低位,24想存储在高位,所以2不变,24 转化为二进制,然后向左移动8位。

然后两者相加就是我们的结果。

2: 0000 0000 0000 0010

24:0000 0000 0001 1000

24向做移动8位,即0001100 0000 0000
然后0000 0000 0000 0010 + 00011000 0000 0000 = 00011000 0000 0010

即结果就是6146

我们如何计算两个数a和b的表示short类型的数据呢?可以通过或操作,即:

0000 0000 0000 0010 | 0001 1000 0000 0000 =

0001 1000 0000 0010

根据结果如何获取高位和低位存储的数呢?

1 设置高低位掩码

获取高位数的掩码:1111111100000000

获取低位树的掩码:0000000011111111

2 然后将6146分别进行高低位&操作:

0001100000000010 & 1111111100000000

获取高位:0001100000000000(6144)

然后向右移动8位,因为之前它是向左移动8位,所以要获取它就得向右移动。即0000 0000 0001 1000 = 24

获取低位:0001 1000 0000 0010 & 0000 0000 11111111

则解雇我诶0000 0000 0000 0010 = 2

五 正数取反

我们对一个正数取反,获取的是该数二进制补码,比如:

给8进行取反操作

~8 = ~(0000 1000)= 11110111

我们要将补码还原成反码,即 进行-1操作

= 11110111 – 1 = 11110110

然后将反码换成原码:

即符号位不变,其余位取反,则10001001 = -9

编程基础 之 位运算专题相关推荐

  1. 洛谷【C++编程基础】递归函数初步 专题解题报告

    洛谷[C++编程基础]递归函数初步 专题解题报告 T1-T89304 递归求和 题目描述 用递归的方法求1+2+3+4+-+(n-1)+n的值. 输入格式 一个整数n.(1<=n<=100 ...

  2. c语言10以内位运算,C语言基础知识--位运算

    1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...

  3. 计算机基础知识---位运算的应用

    Author:baiyucraft BLog: baiyucraft's Home 前置学习: 计算机基础知识-位运算的简介   在了解位运算后,我们要明白一点:为什么要学习位运算呢.其实很重要的一个 ...

  4. 计算机基础知识---位运算的简介

    Author:baiyucraft BLog: baiyucraft's Home 1.什么是位运算   稍微有点计算机基础的都知道一点,在程序中的所有数在计算机内存中都是以二进制的形式存储的.位运算 ...

  5. java基础——java位运算

    位运算 位运算[位运算仅针对整型,进行位运算时,除了long型外,其他类型自动转换成int型,如果移动的位数超过32位(long是64位),编译器会对移动的位数取模] 左移(<<):丢弃最 ...

  6. 位运算专题一:位与、位或、位反

    位运算只用于所有的整型!!(char,short,int,long int,long long,unsigned char,unsigned short......),浮点值均不适用!!! 位运算有哪 ...

  7. java中位运算传参_java基础之位运算讲解于实战

    一.基础知识点概括 在查看源码中,经常会看到很多这样的符号"&"."|"."-","^","<& ...

  8. 计算机系统基础 实验——位运算

    目录 1.negate(取负) 2.bitOr(两数相或) 3.conditional(选择运算符) 4.byteNot(对某个字节取反) 5.allEvenBits 6.byteSwap 7.bit ...

  9. 一个C语言的基本教程—位运算篇

    文章目录 13.从底层操纵数据--位运算篇 (1). 各种数据的存储方式 #1.无符号整型 #2.有符号整型 #3.字符型 #4.浮点型 (2). 什么是位运算 (3). 移位运算 (4). 位与.位 ...

最新文章

  1. Django数据库的查看、删除,创建多张表并建立表之间关系
  2. from表单中 action的后面 内如果是 servlet的虚拟路径的话
  3. linux局域网内根据ip查询主机名
  4. SpringMVC(十一) RequestMapping获取Cookie值
  5. 根据类名遍历数组的三种方法
  6. 帝国cms录入表单模板php,帝国cms7.5在线表单提交制作教程
  7. CDOJ--1850
  8. 【elasticsearch】Failed Elasticsearch bulk request: request retries exceeded max retry timeout
  9. 基于 Vue 的轻量级静态网站生成器 VuePress
  10. 微软公司软件开发模式简介
  11. 老游戏与你共渡亲子时光
  12. 【JZOJ】3424. 粉刷匠
  13. 学会理解和更新kali软件源
  14. 珠峰高 8848 米,一张纸 0.01 米,这张纸对折多少次后高度超过珠峰
  15. 云栖社区 Tensorflow快餐教程
  16. XMind8思维导图 破解版
  17. 分数加减乘除混合运算带答案_100道题,分数加减法混合运算,要答案
  18. shell脚本编写创建多层目录,判断目录是否存在,存在则删除并且给文件赋予权限
  19. 混响(Reverb)/空间音效(Panning)
  20. FTP的主动模式和被动模式工作原理

热门文章

  1. qt程序部署在linux,Qt应用打包发布,部署真正的Qt程序LinuxWindows-Go语言中文社区...
  2. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
  3. oracle长度字段,【转】Oracle中如何取一个字段的定义长度
  4. Android系统开发智能机器人,Android智能机器人详解
  5. 联想 键盘 fn linux,开发者提交补丁,Linux 5.10 或支持联想 PC 键盘快捷键
  6. mysql利用内存表导入数据_Mysql 大量数据导入
  7. 可变悬挂调节软硬_国六最亲民的豪车,丐版2.0T纯进口,全系可变悬架+8气囊,才23万...
  8. 星载计算机西北工业大学,星载计算机SRAM加固可靠性的研究与设计
  9. java占位符打印_什么是 Java 构造器?
  10. cx是什么简称_80年的5角,在纸币收藏界简称为8005