首页 > 编程语言 >C语言中的位运算符和源码反码补码的浅解

C语言中的位运算符和源码反码补码的浅解

时间:2023-04-10 18:24:43浏览次数:40  
标签:11111111 反码 00000000 补码 浅解 运算符 源码 原码

位运算符【与(&);或(|);非(~);异或(^);移位运算符(<< 和 >>)】

对于有符号(正负)的而言:

1)二进制的最高位是符号位:0表示正数,1表示负数
2)正数的原码,反码,补码都一样
3)负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
4)负数的补码=它的反码+1 
5) 

0在计算机种分+0与-0,它们的原码,补码,反码如下:

1、[+0]原码=0000 0000,   [-0]原码=1000 0000;

2、[+0]反码=0000 0000,   [-0]反码=1111 1111;

3、[+0]补码=0000 0000,   [-0]补码=0000 0000;

6)在计算机运算的时候,都是以补码的方式来运算的.(注意)

7)负数的源码-(除了左边第一位,也就是符号位不动,其它取反)>反码-(反码+1)>补码

 

1.与(&)运算符
规则:两个对应操作数的二进制位都为1结果位才为1,否则为0

例:
1 & 2
1为正数,所以源码反码补码都一样,2也是,计算机在运算时使用补码来运算,我们写出1和2的补码
1的补码:00000000 00000000 00000000 00000001
2的补码:00000000 00000000 00000000 00000010
按照 & 规则逐位进行对比
1的补码:00000000 00000000 00000000 00000001
   &
2的补码:00000000 00000000 00000000 00000010         
 结果: 00000000 00000000 00000000 00000000 
+-0的补码是一样的,所以 1 & 2 = 0
--------------------------------------------------
下面使用负数举一个例子
-3 & -4
-3的
源码:10000000 00000000 00000000 00000011
反码(除了符号位不变,其余取反)
  :11111111 11111111 11111111 11111100
补码(反码+1)
  :11111111 11111111 11111111 11111101

同理我们写出-4的原码反码补码
-4的
源码:10000000 00000000 00000000 00000100
反码(除了符号位不变,其余取反)
  :11111111 11111111 11111111 11111011
补码(反码+1)
  :11111111 11111111 11111111 11111110
按照 & 规则逐位进行对比
-3的补码:11111111 11111111 11111111 11111101
  &
-4的补码:11111111 11111111 11111111 11111110
    结果:11111111 11111111 11111111 11111100 (该结果为补码)
补码 -(反码变补码+1,补码变反码当然是-1)>反码
补码:11111111 11111111 11111111 11111100 -(减1)>
反码:11111111 11111111 11111111 11111011 -(除符号位全部取反)>
原码:10000000 00000000 00000000 00000100=-4
所以 -3 & -4 = 4

下面的运算符变换原码反码补码的过程一样,不再举例说明

2.或(|)运算符
规则:两个对应操作数的二进制位都为0结果位才为0,否则为1

3.非(~,按位取反)运算符
规则:一个二进制操作数,对应位为0,结果位为1;对应位为1,结果位为0

4.异或(^)运算符
规则:两个操作数对应二进制位相同,则结果位为0,不同则为1

5.移位运算符(<< 和 >>)
1. 左移(<<)运算符

规则:二进制左移运算符,将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0

1. 右移(>>)运算符
规则:二进制右移运算符,将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃

-3的
源码:10000000 00000000 00000000 00000011
反码:11111111 11111111 11111111 11111100
补码:11111111 11111111 11111111 11111101
左移举例
-3 << 4
-3的补码:11111111 11111111 11111111 11111101
左移4位
(舍弃)1111|1111 11111111 11111111 11111101|0000(补0)
整理一下:11111111 11111111 11111111 11010000
转为反码:11111111 11111111 11111111 11001111
转为原码:10000000 00000000 00000000 00110000
结果为:-48
右移举例
-3 >> 4
-3的补码:11111111 11111111 11111111 11111101
右移4位
(负数左边补1)1111|11111111 11111111 11111111 1111|1101(舍弃)
整理一下:11111111 11111111 11111111 11111111
转为反码:11111111 11111111 11111111 11111110
转为原码:10000000 00000000 00000000 00000001
结果为:-1

 

注:当运算数为正数,右移可以直接除以2^n

例:n=4   19 >> n = 19/2/2/2/2 =

19/2=9......1(遇到小数位丢弃)

9/2=4........1

4/2=2

2/2=1

所以19 >> 4 = 1

相反的,左移可以直接乘以2^n

例:n=4   1 << n = 1*2*2*2*2 = 

1*2=2

2*2=4

4*2=8

8*2=16

所以 1 << 4 = 16

如果是复数则需变成补码进行位移

end;

 

标签:11111111,反码,00000000,补码,浅解,运算符,源码,原码
From: https://www.cnblogs.com/wjl-de-java/p/17303717.html

相关文章

  • 逍遥自在学C语言 | 位运算符&的高级用法
    前言在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍&运算符的一些高级用法。一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、位掩码位掩码是一种用于按位操作的......
  • 直播网站源码,接收方收到的信息等于缓冲区长度
    直播网站源码,接收方收到的信息等于缓冲区长度原因分析:实际上是创建字符串时设置获取数据包的长度不正确,长度不应使用data.length byte[]data=packet.getData();Strings=newString(data,0,data.length);​解决方案:改用packet.getLength()即可解决 publicvoid......
  • Collection - LinkedList源码解析
    简介:LinkedList集合底层是一个双向链表结构,具有增删快,查询慢的特点,内部包含大量操作首尾元素的方法。适用于集合元素先入先出和先入后出的场景,在队列源码中被频繁使用。链表结构的节点新增、删除都非常简单,仅仅把前后节点的指向修改下就好了,所以LinkedList新增和删除速度很......
  • SpringSecurity源码之WebSecurity构建FilterChainProxy
    主要参考了https://mp.weixin.qq.com/s/D0weIKPto4lcuwl9DQpmvQ。SpringSecurity版本是2.7.9。将SpringBoot和SpringSecurity结合使用,SpringSecurity自动配置类是SecurityAutoConfiguration.class。 @AutoConfiguration@ConditionalOnClass({DefaultAuthenticationEventPubli......
  • c++Primer 14 重载运算符与类型转换
    除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参。      泛型算法中调用的几元谓词是看函数对象的调用运算符的参数个数。而不是构造函数的参数个数。    转换构造函数只能有一个参数,如果他有多个参数,就无法判断是将哪个参数转......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandl
    ExceptionHandler的作用ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以捕获不同级别的异常。在Spring中使用ExceptionHandler非......
  • kubegres 源码解析(四)
    CreateSpecCheckerSpecChecker结构体内有resourceStates字段,用于与Spec预设值进行比较.rc.SpecChecker=checker.CreateSpecChecker(rc.KubegresContext,rc.ResourcesStates)typeSpecCheckerstruct{kubegresContextctx.KubegresContextresourcesStat......
  • 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandl
    ExceptionHandler的作用ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,以捕获不同级别的异常。在Spring中使用ExceptionHandle......
  • spring security自动配置的源码简单分析
    本文基于的springboot版本是2.1.3.RELEASE,用springboot来自动配置springsecurity,一、综述在springboot中使用springsecurity只需要引入如下依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId&......