美文网首页
十进制整数的反码

十进制整数的反码

作者: WAI_f | 来源:发表于2020-05-23 23:05 被阅读0次

题目:

每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。
给你一个十进制数 N,请你返回其二进制表示的反码所对应的十进制整数。

示例:

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

解题方法:

开始想的是每次取N最后一位数然后计算对应的S值,然后将S值不断累加就可以了,仔细一想还可以更简单的一点,就是直接用减法计算:

得到N的二进制位数K,然后计算K位二进制数全为1的时候十进制值M,M可以通过等比数列求和公式计算得到;然后把M-N作为结果就可以了,因为M和N对应位置上都为1的话,结果S的二进制对应位置就是0,不全为1的话S对应位置就是1。

代码和结果:

class Solution {
public:
    int bitwiseComplement(int N) {
        if(N==0)
            return 1;
        int S=0;
        int cnt=0;
        int T=N;
        while(T>0)
        {
            T=T>>1;
            cnt++;
        }
        int total=pow(2,cnt)-1;
        S=total-N;
        return S;
    }
};
运行结果:

运行结果出奇的好,第一次运行的时候出了错,因为没有考虑输入为0的情况,我的程序最不满意的地方就是关于0需要单独考虑。这道题比较简单,还能应付,如果复杂了,这种特殊情况就不一定这么简单就能解决,所以不太喜欢这个特殊值。第二次通过了,但是执行用时没有那么好。最后一次就是把计算total的公式稍微调整了一下,然后就是上面的结果了,不太明白少了一个除法为什么能有这么大的提升。

原题链接:https://leetcode-cn.com/problems/complement-of-base-10-integer/

相关文章

  • 十进制整数的反码

    题目: 每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "10...

  • LeetCode 128周赛

    1. 题目列表 十进制整数的反码(进制转换) 总持续时间可被 60 整除的歌曲(数组hash以及简单的排列组合) ...

  • LeetCode 1009. 十进制整数的反码 Compleme

    【题目描述】每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "...

  • 二进制、十进制互转

    十进制整数 转 二进制数组 二进制字符串 转 十进制整数 二进制数组 转 十进制整数

  • C语言里面,%d%c%f分别是什么意思?怎么用?

    %c 单个字符 %d 十进制整数(int) %ld 十进制整数(long) %f 十进制浮点数(float) %l...

  • 笨方法学python习题37

    字符串格式化%d 带符号的十进制整数%i 带符号的十进制整数%o 无符号八进制%u 无符号十进制整数(现在这...

  • java位移操作

    十进制、二进制 十进制数在计算机中的表示方法,对于正数和负数是不一样的。负数:绝对值对应的二进制,取反码,将反码加...

  • 计算机中的浮点数

    一、十进制整数转二进制 1.十进制整数转换为二进制整数采用除2取余,逆序排列法。具体做法是: 用2整除十进制整数,...

  • C语言中浮点型的存储方式

    我们知道,整数在内存中是以补码的形式存放,其中正整数的原码反码补码相同;而负数的补码是它的反码加1. 例: 那么浮...

  • 二进制原码、反码、补码运算及标志位

    一、二进制原码、反码、补码的转换 原码: 正整数的原码:这个数的二进制,符号位为0;正整数的原码=补码=反码 例1...

网友评论

      本文标题:十进制整数的反码

      本文链接:https://www.haomeiwen.com/subject/aberahtx.html