![]() |
1
4
听起来你只想翻转四个位(输入的长度),所以你可能想用1111执行异或运算。 |
![]() |
2
6
Ruby只存储一个(签名的)号码。此数字的内部表示形式与此无关:它可能是fixnum、bignum或其他类型。因此,一个数字中的位数也是未定义的:毕竟它只是一个数字。这与C示例相反,其中int可能是32位(固定)。 那么,~接线员做什么呢?嗯,就像:
…因为这就是“~”在查看2的补码时所表示的。 因此,您的input语句中缺少的是要切换的位数:32位~,不同于一般的~,就像Ruby中一样。 现在,如果您只想位翻转n位,可以执行如下操作:
…但是您必须指定要翻转的位数。这不会影响符号标志,因为使用xor时,该标志不在您的范围之内:) |
![]() |
3
3
见 this question 为什么呢?
您的方法的一个问题是,只有当您只翻转四个有效位时,预期的答案才是真的:
但数字存储在前导零中,~运算符也会翻转所有前导位:
您真的需要指定函数应该如何处理数字,比如
编辑 以下是翻转所有有效位的一种方法:
这给了
这不会给你期望的输出一句恭维话(1),因为它将1视为“1”,而不是“01”。我不知道函数如何在不将宽度作为参数的情况下推断出需要多少前导零。 |
![]() |
4
0
你在做什么(使用
你真正需要做的将取决于你用这个做什么。也就是说,为什么你需要1的补码? |
![]() |
5
0
如果你使用的是字符串,你可以这样做:
如果使用数字,则必须定义有效位的数目,因为:
即使忽略了这个标志,你也可能要处理这个问题。 |
![]() |
6
0
记住,如果传入fixnum,您现在就得到一个补码:表示数字的位数在解释器中是固定的,因此在数字9(二进制1001)的二进制表示前面有前导0。通过检查fixnum的大小,可以找到这个位数。(返回的答案以字节为单位)
~也在bignum上定义。在这种情况下,它的行为就像所有在bignum中指定的位都被颠倒了,然后如果在该bignum前面有一个1的无限字符串。可以想象,将比特流推到一个bignum中,然后反转整个比特流。但是,您需要在反转之前知道位流的大小,以便在反转后得到有用的结果。 要在你马上回答问题的时候,你可以发现最大的2次方小于你的输入,将它加倍,减去1,然后用你的输入对其结果进行异或运算,并且总是得到一个1的补码,就是你输入数字中的有效位。
|
![]() |
Stilian · 存储库设置中没有Github页面部分 2 年前 |
![]() |
Kellen · 查看$卷展栏功能列表 2 年前 |
![]() |
Akshit Thakur Ak · 我怎样才能把铁轨停下来? 2 年前 |
![]() |
johncssjs · 将数组转换为每个元素的嵌套哈希 2 年前 |
![]() |
solidsnake99 · Rails db:如何绕过验证 2 年前 |