LC-1017. 负二进制转换

Posted Miraclo_acc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC-1017. 负二进制转换相关的知识,希望对你有一定的参考价值。

1017. 负二进制转换

难度中等71

给你一个整数 n ,以二进制字符串的形式返回该整数的 **负二进制(base -2)**表示。

**注意,**除非字符串就是 "0",否则返回的字符串中不能含有前导零。

示例 1:

输入:n = 2
输出:"110"
解释:(-2)2 + (-2)1 = 2

示例 2:

输入:n = 3
输出:"111"
解释:(-2)2 + (-2)1 + (-2)0 = 3

示例 3:

输入:n = 4
输出:"100"
解释:(-2)2 = 4

提示:

  • 0 <= n <= 109
class Solution 
    // 与转化为二进制没什么区别,都是除基取余,倒序排列。
    // 不过负二进制的余数可能有0,1,-1,而表示上不能有负数,所以在余数为-1时,要转化为1,同时商+1即可
    public String baseNeg2(int n) 
        if(n == 0) return "0";
        StringBuilder sb = new StringBuilder();
        while(n != 0)
            int remain = n % (-2);
            sb.append(Math.abs(remain));
            n = remain < 0 ? n/(-2)+1 : n/(-2);
        
        return sb.reverse().toString();
    

将负十进制转换为其二进制表示

【中文标题】将负十进制转换为其二进制表示【英文标题】:Turning a negative decimal into its binary representation 【发布时间】:2021-12-07 16:22:06 【问题描述】:

我正在尝试找出一种方法,我可以从用户那里获取输入,并将其显示在 BinRep[] 数组中。目前这个程序只适用于正数,但是我很难找到一种方法让它也适用于负数。有什么想法吗?

int n = atoi(argv[1]);
  int binRep[N];
  int i;
  int flippedNum;

  for (i = 0; i < N; i++) 
    binRep[i] = 0;
  

  i = 0;

  while (n > 0) 
    binRep[i] = n % 2;
    n = n / 2;
    i++;
  

  for (i = N - 1; i >= 0; i--) 
    printf("%d", binRep[i]);
  
  printf("\n");
  return 0;

【问题讨论】:

您了解带符号的数字如何用二进制表示 - 即二进制补码吗?一种方法是将正数转换为二进制,然后应用二进制补码来获得负表示。似乎您或编写代码的人可能已经按照未使用的flippedNum 变量所暗示的这些思路进行思考。 您是否只是想在二进制中显示与输入为正数相同的数字,但前面有一个- 没有。二进制输出应该是数字的正数。 IE -7 和 7 应该输出相同(二进制为 7)。 哦,那听起来你只需要添加n = abs(n);。别忘了#include &lt;math.h&gt; 这就是我原本打算做的,但它似乎太简单了。输出是正确的,但我有一种可疑的感觉,由于某种原因它不会通过 GitHub autograder ......无论如何,感谢您的帮助!如果不允许,我想我会回信。 【参考方案1】:
unsigned int n = (unsigned int ) atoi( argv[1] );
unsigned int binRep[N];

应该工作

但负数将采用二进制补码表示。

【讨论】:

命令行输入必须是有效的有符号整数。这就是为什么我在其他方面遇到麻烦。 1.) 命令行的输入始终是 char * 2.) atoi( argv[1] ) 输出 int 3.) (unsigned int) 将此输出转换为 unsigned int 你能解释一下为什么这样有效吗?我希望能够完全理解和掌握它。 twos complement wikipedia 如果您无法理解我的评论,我会推荐“C 编程语言” 我阅读了 Wiki 文章和其他一些堆栈溢出帖子。我仍然没有完全掌握它,这似乎很重要。无论如何,你可以给我一个简短的说明为什么会这样吗?

以上是关于LC-1017. 负二进制转换的主要内容,如果未能解决你的问题,请参考以下文章

[CODEUP] 1943 进制转换

LeetCode405 数字转换为十六进制数

《LeetCode之每日一题》:166.数字转换为十六进制数

leetcode 简单 第九十五题 数字转换为十六进制数

LeetCode 405 数字转换为十六进制数[异或 位运算] HERODING的LeetCode之路

Leetcode 600.不包含连续1的非负整数