c语言基础难关:按位取反
1.理解按位取反的前提
符号位
二进制最前端的1代表负数,0代表正数,符号位一般会占据最前端
比如1字节数的0可以表示为
[0000 0000] |
1个字节最大存储数为
[0111 1111] 或 [1111 1111] |
原码反码补码的相互转化
正数的相互转化
原码:符号位为0,其后将十进制转化为二进制,得到的就是其原码 |
负数的相互转化
原码:符号位为1,其后将十进制转化为二进制,得到的就是其原码 |
举例
正数 1 --- [0000 0001]原 --- [0000 0001]反 --- [0000 0001]补 |
2.按位取反的具体逻辑
得到新补码后要注意符号位是什么,如果为1则继续推演,如果为0,则得到的新补码就是新原码
步骤
(1)得到该数的补码
(2)对补码取反,得到新的补码
(3) 对新补码反向求原码
对于得到新补码逆向求出新原码的过程
如果把负数原码到补码的过程当作通用的流程 |
举例
0的按位取反 |
根据计算器可看出来推演正确
-2的按位取反 |
根据计算器可知演算过程正确
一些简便按位取反的简便计算
取反的符号为’ ~ ‘
1.一个数取反再取反便是他本身,例如 ~ ( ~ 100 ) = 100
2.负数的取反可由公式直接推得
公式 ~x=-(x+1)
例如~ (-100) = - (-100 + 1) = 99
也可以理解为负数的取反就是 负数的绝对值减1
即 ~ (100)= |-100| - 1 = 99
请给本菜鸟一个点赞和收藏吧
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 涅槃豆の博客!
评论