从基数10转换为基数2,无需内置基数转换


16

背景

您已获得分配,可以将基数10的数字转换为基数2,而不使用任何预制的基数转换功能。您也不能使用任何导入的库。

问题

将输入字符串从10进制(十进制)转换为2进制(二进制)。您不得使用任何预制的基本转换代码/函数/方法或导入的库。由于这是,因此以字节为单位的最短答案将获胜。

输入范围为-32768至32767(在代码中包括符号字节处理)


3
问:“符号字节处理”是什么意思-我应该为负数输出“ -xxxx”吗?那么我们当中有些人是错误的,包括。我,因为我输出-1的“ 11 ... 11”(又名无符号)
blabla999 2014年

符号字节处理-带符号变量的MSB控制它们是否为负
TheDoctor 2014年

1
当然可以,但是我是否必须>打印<将它们打印为符号“-”,然后加上幅度?
blabla999

@ blabla999 -不,你不
TheDoctor

3
the MSB of signed variables controls if they are negative-听起来像是符号位,但是正如范围所-32768..32767建议的,您需要2的补码。那么,您想要哪个呢?
。– mniip

Answers:


4

GolfScript-17个字节

~{.1&\2/}16*;]-1%

没有比内置更多的冗长~2base


1
我不知道golfscript,但是一些示例使我得出结论,您应该删除~
user12205 2014年

@ace "37"例如,因为初始输入是一个字符串,所以该操作"37" & 1(以infix 结尾)是一个按设定的操作。在~在前面的输入转换为整数。
primo 2014年

我在这里做了测试,golfscript.apphb.com / ...这是否意味着该解释器不正确?(对不起,我真的对golfscript一无所知)
user12205 2014年

2
口译员是正确的;因为您已将整数值压入10堆栈,所以没有必要对其求值。但是,从中读取时stdin,输入将是字符串(此处为test)。问题描述还明确指出输入是字符串。
primo 2014年

12

JavaScript,46

for(x=prompt(o='');x;x>>>=1)o=(x&1)+o;alert(o)

大声笑,我什至不知道存在4个字符的运算符(>>>=)!+1(另外,如果您在控制台中运行它,则可以保存最后9个字符。)
Doorknob

1
它不是4个字符,而是两个运算符:>>>是0填充的按位右移,后跟一个赋值。尝试:x=8; x>>>=1; x;并且x=8; x>>>1; x;-在第一种情况下,x的值已更改;在第二,它没有。
格雷厄姆·查尔斯

3
@GrahamCharles >>>=单个运算符
primo 2014年

好吧,看那个!谢谢,@ primo ...您每天都学到一些东西!
格雷厄姆·查尔斯

2
@ComFreek这将颠倒数字的顺序
复制

4

Brainf * ck,98 77

显然,这不是为了获胜,而是如果没有brainfk解决方案,比赛将是什么?

++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]

由于brainfk只能处理8位整数且没有负数,所以我猜它不能完全遵守规则,但是嘿,我从来没有赢得过规则。

如果您的解释器支持,这实际上适用于16位输入

我什至可以将其输出为ASCII值

这是带注释的代码:

++[>++++<-]                       preload 8 onto cell 1
>>,<                                input into cell 2
[-                                  iterate over cell 1
    >>++<                               put 2 in cell 3
    [->-[>+>>]>[+[-<+>]>+>>]<<<<<]      division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
    >[-]++++++[->++++++++<]>           clears cell 4 and puts 48(ascii of 0) into cell 5
    .[-]                                output n%2 and clear it (the bit)
    >[-<<<+>>>]                         bring n/2 into cell 2 (to be used for division in next iteration)
<<<<]                               end iterate

较短的算法(77):

+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]

这个只能处理8位整数。

该算法通过使用一个实际上很短的二进制计数器来工作(一个增量就是>[->]++[-<+]-<-对比特进行布局。问题在于,很难打印出所有比特

可以以字节为代价,使最后一种算法适合于任意数量的位。为了能够处理N位整数,需要53 + 3 * N字节进行编码。

例子:

(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc

3

强制性APL答案-21 22

"01"[1+2|⌊⎕÷2⋆⊖0,⍳15]

例子:

      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 0
0000000000000000
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 13
0000000000001101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 9999
0010011100001111
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: -3
1111111111111101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 32767
0111111111111111

可以通过使用几乎降低50% ⎕IO←0,并返回位而不是字符串的数组:2|⌊⎕÷2*⊖⍳16
亚当

3

图灵机代码,272字节

和往常一样,我使用此处定义的规则表语法您可以在该站点上进行测试,也可以使用此java实现。

许多代码是从这里的十进制到十六进制转换器中复制的

0 * * l B
B * * l C
C * 0 r D
D * * r E
E * * r A
A _ * l 1
A * * r *
1 0 9 l 1
1 1 0 l 2
1 2 1 l 2
1 3 2 l 2
1 4 3 l 2
1 5 4 l 2
1 6 5 l 2
1 7 6 l 2
1 8 7 l 2
1 9 8 l 2
1 _ * r Y
Y * * * X
X * _ r X
X _ _ * halt
2 * * l 2
2 _ _ l 3
3 * 1 r 4
3 1 0 l 3
4 * * r 4
4 _ _ r A

从基数10的输入开始递减计数,而从基数2的0开始递增计数。递减为零时,它将擦除输入块并终止。


2

Javascript 59

o='';i=parseInt(prompt());do{o=(i&1)+o}while(i>>=1)alert(o)

您可以使用+x,而不是parseInt(x)
Cyoce

2

Perl,44岁

这是我有史以来的第一个Perl程序,因此,如果可以很容易地进一步了解它,请原谅我。编辑:谢谢@primo从我的答案中拿走了7个字符。

$x=<>;do{@s=($x&1,@s)}while($x>>=1);print@s

$x=<>;do{push@s,$x&1}while($x>>=1);print reverse@s

逻辑与我以前的C解决方案基本相同。

另外,使用64位。


1
您可以reverse通过向后构造数组来保存@s=($x&1,@s)
primo 2014年

1
现在,比赛结束,我发现最好的是34: $\=$_%2 .$\while$_=$_>>1||<>;print。或者,如果命令行选项每个计数一个字节,则27:1while$\=$_%2 .$\,$_>>=1}{使用-p
2014年

2

Javascript- 56 48和36 28个字符

  • 不适用于负数。

感谢@Blender剃掉了8个字符。

此表单接受输入并显示输出,包含48个字符:

x=prompt();for(a="";x;x=~~(x/2))a=x%2+a;alert(a)

如果仅需要将变量放入a二进制形式的指令x(并且您不必费心破坏x值的副作用),这里的字符数为28个:

for(a="";x;x=~~(x/2))a=x%2+a

1
您可以替换Math.floor~~,因为数字范围较小。
Blender 2014年

@Blender谢谢,我知道存在某种方式,只是找不到。
Victor Stafusa 2014年

@Victor我不懂javascript,所以我可能是错的,但是最后当您说a=x%2+a可以缩短为a+=x%2?它适用于我所知道的所有语言。
艾伯特·伦肖2014年

@AlbertRenshaw不,这与相同a=a+x%2,但是+用于字符串连接。即,您的建议将数字按倒序排列。
Victor Stafusa 2014年

@Victor Ah!谢谢!
艾伯特·伦肖2014年


2

C,55个字符

打印一个额外的前导零(为了2个字节)。
内递归会printf反转打印顺序,因此算法从右到左提取位,但从左到右打印。

编辑:通过使用putchar而不是保存了一个字符printf

f(x){(x*=x<0?-printf("-"):1)&&f(x/2);putchar(48+x%2);}

2

Dyalog APL,11 个字节

2|⌊⎕÷2*⌽⍳16

2|将输入
的四舍五入后的值除以二的整数除以{0、1、2,...,15} 的幂后的余数

÷
2*
⍳16

要求⎕IO←0在许多系统上是默认设置。

在线尝试APL!


1

C,81

char b[17];i=15;main(x){scanf("%d",&x);while(i+1)b[i--]=(x&1)+48,x>>=1;puts(b);}

输出具有严格的16位(包括填充零)


1

Apps脚本+谷歌表格147个 144 121字节

脚本

function j(decNumb){var str='';do{str=String(decNumb%2)+str;decNumb=decNumb/2|0;}while(decNumb>=1);return parseInt(str);}

=j(b1)

ZygD 对该脚本的修改版本。


您可以删除任何空格吗?
NoOneIsHere

1

Haskell,66个字节

c 0=0
c n=c(div n 2)*10+mod n 2
b('-':r)='-':b r
b r=show.c.read$r

致电b "-1023",添加main=interact b完整的程序,或 在Ideon上尝试。

c对正整数执行转换。
b r=show.c.read$r将字符串转换为数字,应用c并将其转换回字符串。
b('-':r)='-':b r去除可能的前导-并将其重新添加到结果中。



1

APL(NARS),17个字符,34个字节

{2∣⌊⍵÷2*(⍺-1)..0}

它是对亚当答案/codegolf//a/90107的复制和修改, 可以添加长度参数的形式,为此功能的⎕IO(此处为⎕IO= 1)应不重要...

  f←{2∣⌊⍵÷2*(⍺-1)..0}
  16 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  16 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  64 f ¯12345678
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 

它看起来很容易以这种方式处理位数(我为最后一个结果感到正确)


0

Smalltalk(Smalltalk / X),63/78

第一个版本创建一个中间字符串(78):

t:=Number readFrom:Stdin.
((15to:1by:-1)collect:[:i|$0+(t>>i&1)]as:String)print

实际上,不需要创建字符串;只需输出字符(63):

t:=Number readFrom:Stdin.
15to:1by:-1 do:[:i|($0+(t>>i&1))print]

嗯-有没有更短的方法来读取数字?


0

Python 3.x:65个字符

b=lambda n:n<2 and'01'[n]or b(n//2)+b(n%2);print(b(int(input())))

0

Bash,44岁

f=b+=n/2**e%2*10**e,2**e++/n?f=b:f;echo $[f]

通过环境变量将输入值传递给脚本n。二进制结果的小数表示不能超过LONG_MAX

这也应该是兼容ksh93并且zsh如果be被初始化0和适当的算术扩展使用。


1
我不认为这是有效的,因为它假设n已经定义好了,因此成为了摘要。通过将输入作为命令行参数并将其设置n为脚本中的参数,可以解决此问题。
意大利面条2015年

@quartata在Shell中的数学上下文中的变量隐式为零。为了高尔夫的目的,做n=127 sh -c '...'比做更有意义sh -c 'n=$1 ...' _ 127。在这种情况下,没有理由比另一种偏爱它们,因为它们都是传递值的完美方式。
ormaaj

0

C#-104

string p(int d){var r="";long i=1;while(r.Length<=64){var g=d&i;r=(g!=0)? "1"+r:"0"+r;i=i<<1;}return r;}

此方法会将十进制数转换为二进制数(最多64位数)。

在Linqpad中执行上述方法时-rr = p(-32768); rr.Dump();

输出: 01111111111111111111111111111111111111111111111111000000000000000


规范要求“输入字符串”。看来此方法接受一个int

0

Java 8、80 71字节

n->{String r="";for(int i=n<0?-n:n;i>0;i/=2)r=i%2+r;return n==0?"0":r;}

由于注释中有一个规则,因此为-9个字节。以10为负的负输入可能会明显返回以正/绝对的base-2值作为输出。

说明:

在线尝试。

n->{                   // Method with integer parameter and String return-type
  String r="";         //  Result-String, starting empty
  for(int i=n<0?-n:n;  //  Start `i` at the absolute (non-negative) value of the input
      i>0;             //  Loop as long as `i` is not 0
      i/=2)            //    After every iteration: integer-divide `i` by 2
    r=i%2+r;           //   Prepend the result with `i` modulo-2
  return n==0?         //  If the input is 0:
          "0"          //   Return literal "0"
         :             //  Else:
          r;           //   Return the result-String


0

小基础,133字节

TextWindow控制台输入和输出到控制台的脚本。

n=TextWindow.Read()
While n>0
c=c+1
x[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
For i=0To c-1
TextWindow.Write(x[c-i])
EndFor

在SmallBasic.com上尝试。 需要Silverlight,因此必须在IE中运行。

I / O是从黑色控制台获取/提供的。

-22个字节感谢@Neil


你不能使用For i=0To c-1吗?
尼尔

@Neil-我绝对可以。很棒!
泰勒·斯科特

0

MATL15 17字节

t0<?16Ww+]`2&\t]x

在MATL Online上尝试

蒂奥

(+2个字节除去负数的前导0,符号位应为第一位。)

自下而上阅读MATL Online上的输出(MSB在底部)。

主要部分非常简单: `2&\t =当值大于0时,除以2并累加余数。

处理负数并赋予它们2的补码表示是棘手的部分。最后,我选择了“ 减去2ñ”的方法来获取数字的二进制补码。由于我们只需要处理高达-32768的值,因此对于负数,代码将创建 216=65536使用16W,将输入添加到该输入(例如65536 +(-42)),这使MATLAB看到的是一个正数,但以16位形式表示输入的带符号二进制表示形式。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.