c语言基础难关:按位取反-创新互联
按位取反
文章题目:c语言基础难关:按位取反-创新互联
文章来源:http://cdiso.cn/article/djedjc.html
- 1.理解按位取反的前提
- 符号位
- 原码反码补码的相互转化
- 正数的相互转化
- 负数的相互转化
- 2.按位取反的具体逻辑
- (1)得到该数的补码
- (2)对补码取反,得到新的补码
- (3) 对新补码反向求原码
- 举例
- 一些简便按位取反的简便计算
- 请给本菜鸟一个点赞和收藏吧
二进制最前端的1代表负数,0代表正数,符号位一般会占据最前端
比如1字节数的0可以表示为
[0000 0000]
1个字节大存储数为
[0111 1111] 或 [1111 1111]
分别是2的8次方-1,即 255 和 -255
符号位占据了一个比特位
原码反码补码的相互转化正数的相互转化原码:符号位为0,其后将十进制转化为二进制,得到的就是其原码
反码:与原码相同
补码:与原码相同
负数的相互转化 原码:符号位为1,其后将十进制转化为二进制,得到的就是其原码
反码:符号位不变,其余都进行取反,原先为1的变为0,原先为0的变为1
补码:反码+1
举例
正数 1 --- [0000 0001]原 --- [0000 0001]反 --- [0000 0001]补
负数 -1 --- [1000 0001]原 --- [1111 1110]反 --- [1111 1111]补
2.按位取反的具体逻辑得到新补码后要注意符号位是什么,如果为1则继续推演,如果为0,则得到的新补码就是新原码
步骤
对于得到新补码逆向求出新原码的过程
如果把负数原码到补码的过程当作通用的流程
那么原码到反码,先要保留符号位,然后再对原码取反
最后反码加1得到补码
那么逆向过程 补码 ->反码->原码
则为
补码减一得到反码
反码再保留符号位得到原码
举例0的按位取反
1.得到补码
[0000 0000]原码
由于正数的原码反码补码相同,则
[0000 0000]为补码
2.对补码取反,得到新的补码
[0000 0000] 原先的补码
[1111 1111]新补码
3.逆向求原码
补码减一得到反码
[1111 1110]新反码
反码取反得到原码
则符号不变,其余取反
[1000 0001] 新原码
根据计算器可看出来推演正确
-2的按位取反
1.得到原码
[1000 0010] 原码
得到反码时符号位不变,其余取反
[1111 1101] 反码
反码加1得补码
[1111 1110] 补码
2.对补码取反,得到新的原码
[1111 1110] 原先的补码
取反
[0000 0001] 新补码
由于新补码符号位为0,则其新原码与其新补码相同
[0000 0001] 新原码
根据计算器可知演算过程正确
一些简便按位取反的简便计算取反的符号为’ ~ ’
1.一个数取反再取反便是他本身,例如 ~ ( ~ 100 ) = 100
2.负数的取反可由公式直接推得
公式 ~x=-(x+1)
例如~ (-100) = - (-100 + 1) = 99
也可以理解为负数的取反就是 负数的绝对值减1
即 ~ (100)= |-100| - 1 = 99
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章题目:c语言基础难关:按位取反-创新互联
文章来源:http://cdiso.cn/article/djedjc.html