[C++基础]原码/反码/补码、二进制位运算
来源:互联网 发布:钢铁侠反应堆淘宝 编辑:程序博客网 时间:2024/06/07 11:53
原码/反码/补码
编码
定义
实例
原码
最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
【+100】原=01100100 【+0】原=00000000
【-100】原=11100100 【-0】原=10000000注意:在原码中,零有两种表示形式。
反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
【+100】反=01100100 【+0】反=00000000
【-100】反=10011011【-0】反=11111111
注意:在反码中,零也有两种表示形式。
反码运算也不方便,通常用来作为求补码的中间过渡。
补码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
【+100】补=01100100 【+0】补=00000000
【-100】补=10011100 【-0】补=00000000
注意:在补码中,零有唯一的编码,【+0】补=【-0】补=00000000。
注:8位二进制反码的表示范围:-127~+127
为什么计算机一般采用补码表示法
原码、反码和补码是由于表示负数的三种方案,三种方案中,原码最适合与乘除类运算,补码适合于加减类运算,而反码则加减与乘除都不是很理想,由于加减运算的频率远高于乘除运算,所以多数计算机系统采用的是补码方案。所以所有计算机的加减运算都要将相应的数转换成补码,然后再进行运算
- 原码是数制转换的产物,用于合乎人类逻辑的数字转换。
- 反码是一种形式化的中间产物,没什么实际作用,我们看不懂,计算机也看不懂,它的意义在于衔接。
- 补码是形式化的产品,直接用于形式化的逻辑运算,是计算机的逻辑电路进行运算的基础
二进制位运算
如果用一个字节来表示整数(1个字节是8位):7的8位二进制为: 0000 0111
如果用四个字节来表示整数(4个字节是32位):7的32位二进制为: 0000 0000 0000 0000 0000 0000 0000 0111
位运算是指按二进制位进行的运算。
运算符
含义
功能
&
按位与
如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
|
按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1。
∧
按位异或
若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真)
~
取反
~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
<<
左移
左移运算符是用来将一个数的各二进制位全部左移N位,右补0。
>>
右移
表示将a的各二进制位右移N位,移到右端的低位被舍弃,对无符号数,高位补0。
位运算应用口诀 :清零取反要用与,某位置一可用或 ;若要取反和交换,轻轻松松用异或
实例:
功能
示例
位运算
去掉最后一位
(101101->10110)
x >> 1
在最后加一个0
(101101->1011010)
x < < 1
在最后加一个1
(101101->1011011)
x < < 1+1
把最后一位变成1
(101100->101101)
x | 1
把最后一位变成0
(101101->101100)
x | 1-1
最后一位取反
(101101->101100)
x ^ 1
把右数第k位变成1
(101001->101101,k=3)
x | (1 < < (k-1))
把右数第k位变成0
(101101->101001,k=3)
x & ~ (1 < < (k-1))
右数第k位取反
(101001->101101,k=3)
x ^ (1 < < (k-1))
取末三位
(1101101->101)
x & 7
取末k位
(1101101->1101,k=5)
x & ((1 < < k)-1)
取右数第k位
(1101101->1,k=4)
x >> (k-1) & 1
把末k位变成1
(101001->101111,k=4)
x | (1 < < k-1)
末k位取反
(101001->100110,k=4)
x ^ (1 < < k-1)
把右边连续的1变成0
(100101111->100100000)
x & (x+1)
把右起第一个0变成1
(100101111->100111111)
x | (x+1)
把右边连续的0变成1
(11011000->11011111)
x | (x-1)
取右边连续的1
(100101111->1111)
(x ^ (x+1)) >> 1
去掉右起第一个1的左边
(100101000->1000)
x & (x ^ (x-1))
判断奇数
(x&1)==1
判断偶数
(x&1)==0
- [C++基础]原码/反码/补码、二进制位运算
- 原码反码补码基础
- 原码反码补码基础
- [基础]原码反码补码
- C 【原码 反码 补码】
- C语言之位运算/原码/反码/补码
- c语言的原码补码反码-位运算
- C语言基础之《原码,反码,补码》
- C语言基础-----进制转换,原码反码补码
- (C基础)字节,原码,反码,补码
- c语言基础系列-原码 反码 补码10
- C语言基础 原码 反码 补码 移码简介
- 原码,反码,补码及运算
- 原码,反码,补码及运算
- 原码,反码,补码及运算
- 原码,反码,补码及运算
- 原码反码补码加减运算
- 原码,反码,补码 及 移位运算
- CDOJ 数据结构训练K
- SlidingMenu getSupportActionBar()方法不能用
- CDOJ 数据结构训练 J
- virtualbox 中的linux 共享文件 发生文件系统类型错误的解决办法
- CDOJ 数据结构训练H 树状数组离散化
- [C++基础]原码/反码/补码、二进制位运算
- CDOJ 数据结构训练F 树状数组
- apk反编译修改
- CDOJ 数据结构训练 E
- UC编程9-管道pipe操作和共享内存段shm操作
- 在vim配置文件中添加对Python的支持
- [连载]JavaScript讲义(04)--- 函数和闭包
- 《剑指offer》面试题5从头到尾打印链表
- 如何读取一个数据库的字段,并生成一个数列