c语言实现单字节反码,leetcode1009(十进制整数的反码)--C语言实现

b473c6233e933feb77a9404a913e74bc.png

每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。

二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。

给你一个十进制数 N,请你返回其二进制表示的反码所对应的十进制整数。

示例 1:

输入:5

输出:2

解释:5 的二进制表示为 "101",其二进制反码为 "010",也就是十进制中的 2 。

示例 2:

输入:7

输出:0

解释:7 的二进制表示为 "111",其二进制反码为 "000",也就是十进制中的 0 。

示例 3:

输入:10

输出:5

解释:10 的二进制表示为 "1010",其二进制反码为 "0101",也就是十进制中的 5 。

思路:观察到问题本质是反转位,可以直接和1进行异或操作,0异或1得1,1异或1得0,这样就可以做到对每一位上的数字反转。那么,我们首先需要创建一个和原数表示位数相同的,各位全为1的数,因此我们先统计出原数在计算机内存中占用的位数,然后将1左移位对应的位数并-1,则对应的是在无符号的情况下的当前位数所能表示的最大数,与原数异或返回最终答案。注意考虑原数为0的情况,这种情况我们写的统计位数的循环是不进入的,需要做特殊处理,直接返回1。

解:

int

bitwiseComplement(

int

N){

if

(N==

0

)

return

1

;

int

i,n,count;

long

long

sum;

for

(n=N,count=0;n!=

0

;n>>=

1

)  ++count;

for

(i=

0,sum=1

;i

1

;

return

N ^ (sum-

1

);

}

更简单的(只要新的全1数和原数位数相等即可,位数具体是多少位并不重要):

int

findComplement(

int

num){

if

(num==

0

)

return

1

;

long

long

temp =

1

;

while

(num >= temp) temp <<=

1

;

return

((temp-

1

) ^ num);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值