476. Number Complement 难度:简单

本文介绍了一种求解整数补数的有效算法,并提供了C语言及Python两种版本的实现代码。通过计算输入整数的二进制表示的补数,即反转其二进制位,从而得出结果。

Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.

Note:
1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
2. You could assume no leading zero bit in the integer’s binary representation.

Example 1:
Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.

Example 2:
Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.

算法分析:用一个临时变量t来标记num的二进制数的长度,然后用t-1与num异或,就能得到num的补数。

C语言版

int findComplement(int num) {
    int n = num, t = 1;
    while(n)
    {
        n = n >> 1;
        t = t << 1;
    }

    return num ^ (t - 1);
}

Python版

class Solution(object):
    def findComplement(self, num):
        """
        :type num: int
        :rtype: int
        """
        return num ^ ((1 << num.bit_length()) - 1)
待实现的15个函数功能,一共分为三种类型。 表 1 位运算 函数名称 功能描述 难度等级 最大操作数 bitXor(x, y) 只用 & 和 ~ 实现 x^y 1 14 getByte(x, n) 从字x中取出第n个字节 2 6 logicalShift(x, n) 逻辑右移 3 20 bitCount(x) 计算x中1的数目 4 40 conditional(x,y,z) 类似于C语言中的 x ? y : z 4 12 表 2 二进制补码运算 函数名称 功能描述 难度等级 最大操作数 tmin() 返回最小的补码 1 4 fitsBits(x,n) x的补码是否可以表示成n位 2 15 dividePower2(x,n) 计算x/(2n) 2 15 negate(x) 不用负号得到 -x 2 5 howManyBits(x) 计算表达 x 所需的最少位数 4 90 isLessOrEqual(x,y) x <= y? 3 24 intLog2(x) 计算⌊log2(x)⌋(向下取整) 4 90 表 3 浮点数运算 函数名称 功能描述 难度等级 最大操作数 floatAbsVal(uf) 计算f的绝对值的位级表示 2 10 floatScale1d2(uf) 计算0.5*f的位级表示 4 30 floatFloat2Int(uf) 计算(int)f的位级表示 4 30 bits.c文件: 这个是源码文件,里面包含了上述待实现的函数,已经给出函数原型。实验内容是按照每个函数的要求编写实现其功能的代码。例如: /* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1 * Legal ops: ~ & * Max ops: 14 * Rating: 1 */ int bitXor(int x, int y) { return 2; } 函数名 bitXor 参数 int , int 功能实现 x^y 要求 只能使用 ~ 和 运算符,将结果返回。 你需要做的就是按照功能描述和最大操作数的要求,实现bits.c中的每个函数。上面的例子就是使用两个运算符~和|来实现运算符的功能,并且你所使用的运算符个数不能超过 Max ops: 14 个,这就需要你先去推理如何用~和|实现,然后写出表达式。bits.c中所有要实现的函数只允许使用! \ ~ & ^ | + << >>这8个操作符。 请同学们务必认真阅读bits.c文件中的说明、注意事项和示例。 实验操作 第0步:用git获取实验初始文件: 在虚拟桌面左边窗口的上方点击“GitLab”。 “点击复制”按钮,复制git仓库地址。 关闭上述界面,在左边窗口的上方点击“更多”,选择“剪切板“。 在剪切板中ctrl+v贴入git仓库地址。 关闭上述界面,在命令行界面中输入下述命令,你要把http地址替换成你的仓库地址,按照提示输入GitLab的用户名和密码: git clone http://172.16.2.166/2020302111371/expProject2026-674.git csapp-datalab 进入该目录,你就可以开始工作啦! 第2步:实现bits.c中的函数,使用dlc编译器检查代码是否满足编码要求,命令如下: unix> ./dlc bits.c dlc -e参数可以检查你使用的运算符数量。如果没有问题,则不返回任何提示。 第3步:使用btest程序测试函数功能正确性。编译btest程序并进行测试,命令如下: unix> make btest unix> ./btest 注意,只要修改了bits.c文件,就需要重新编译btest程序,命令如下: unix> make clean unix> make btest btest程序将自动运行很多组测试用例来检查你实现的函数,下面是一些btest的使用技巧: unix> ./btest -h #输出btest命令的帮助信息 unix> ./btest -f foo #测试指定函数foo的正确性 unix> ./btest -f foo -1 27 -2 0xf #指定输入参数,测试函数foo的正确性 对实验操作有不懂的地方,可参考csapp-datalab目录中的README文件。 实验评价 本实验的实验评价包括两部分:自动评测和实验报告。 自动评测 本地测试通过后,务必一定进行在线评测,否则没有成绩!!! 将bits.c文件拷贝到桌面上: unix> cp ./bits.c ~/Desktop
最新发布
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值