通过移位求绝对值或者加符号位

#include "stdio.h"
#include <stdlib.h>
typedef short int16_t;
int main()
{
    FILE *fp = fopen("a.txt","w+");

    for(int16_t d = -10; d<=10; d++)
    {
        int level = d;//注意:选择更高位宽保存 
        int sign = level>>31;//获取符号位(值为-1或0)
        int x = (level + sign) ^ sign;//获取绝对值 
        int y = (x ^ sign) - sign;//补回符号位
        fprintf(fp,"d = %8d level = %8d sign = %3d x = %8d  y = %8d\n",d,level,sign,x,y);
    }
    fclose(fp);
    return 0;
}

结果:

d =      -10 level =      -10 sign =  -1 x =       10  y =      -10
d =       -9 level =       -9 sign =  -1 x =        9  y =       -9
d =       -8 level =       -8 sign =  -1 x =        8  y =       -8
d =       -7 level =       -7 sign =  -1 x =        7  y =       -7
d =       -6 level =       -6 sign =  -1 x =        6  y =       -6
d =       -5 level =       -5 sign =  -1 x =        5  y =       -5
d =       -4 level =       -4 sign =  -1 x =        4  y =       -4
d =       -3 level =       -3 sign =  -1 x =        3  y =       -3
d =       -2 level =       -2 sign =  -1 x =        2  y =       -2
d =       -1 level =       -1 sign =  -1 x =        1  y =       -1
d =        0 level =        0 sign =   0 x =        0  y =        0
d =        1 level =        1 sign =   0 x =        1  y =        1
d =        2 level =        2 sign =   0 x =        2  y =        2
d =        3 level =        3 sign =   0 x =        3  y =        3
d =        4 level =        4 sign =   0 x =        4  y =        4
d =        5 level =        5 sign =   0 x =        5  y =        5
d =        6 level =        6 sign =   0 x =        6  y =        6
d =        7 level =        7 sign =   0 x =        7  y =        7
d =        8 level =        8 sign =   0 x =        8  y =        8
d =        9 level =        9 sign =   0 x =        9  y =        9
d =       10 level =       10 sign =   0 x =       10  y =       10

绝对值举例:
5: 原码:00000000 00000000 00000000 00000101
5: 反码:00000000 00000000 00000000 00000101
5: 补码:00000000 00000000 00000000 00000101


符号位 sign = 0
(5+0)^0 = 5 
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000000
-------------------------------------
00000000 00000000 00000000 00000101


-5: 原码:10000000 00000000 00000000 00000101
-5: 反码:11111111 11111111 11111111 11111010 
-5: 补码:11111111 11111111 11111111 11111011 


-6: 原码:10000000 00000000 00000000 00000110
-6: 反码:11111111 11111111 11111111 11111001
-6: 补码:11111111 11111111 11111111 11111010
符号位 sign = 0
(-5+ (-1))^(-1) = 5 
11111111 11111111 11111111 11111010 (-6)
11111111 11111111 11111111 11111111
-------------------------------------
00000000 00000000 00000000 00000101


加符号位举例:


5: 原码:00000000 00000000 00000000 00000101
5: 反码:00000000 00000000 00000000 00000101
5: 补码:00000000 00000000 00000000 00000101


1. 符号位 sign = 0
(5^0) - 0 = 5
2. 符号位 sign = -1
(5^-1) - (-1) = -5  
00000000 00000000 00000000 00000101
11111111 11111111 11111111 11111111
-------------------------------------
11111111 11111111 11111111 11111010  (相当于取反操作)


 11111111 11111111 11111111 11111010 + 1
=11111111 11111111 11111111 11111011 (补码-5)
 11111111 11111111 11111111 11111010 (反码-5)
 00000000 00000000 00000000 00000101 (原码-5)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值