十六进制到二进制


10

将十六进制数(任意大小)转换为二进制数。

输入
一个正的十六进制数字,以a 0x开头。有效输入将始终与以下正则表达式匹配:0x[0-9a-fA-F]+。如果输入的不是有效的十六进制数字,即与该正则表达式不匹配的任何数字,则输出应为0

输出
将十六进制转换为二进制。

赢得
原始代码高尔夫球规则,咬伤次数最少(bytes)

例子

IN: 0x12
OUT: 10010

IN: 0xFF
OUT: 11111111

IN: 0XFF
OUT: 0

IN: #0ac4
OUT: 0

IN: 0x00101011
OUT: 100000001000000010001

IN: 0x525600
OUT: 10100100101011000000000

IN: 0x58f70555118ec400
OUT: 101100011110111000001010101010100010001100011101100010000000000

IN: 0x6669795966AF3000
OUT: 110011001101001011110010101100101100110101011110011000000000000

IN: 0b018474
OUT: 0

IN: 9577383
OUT: 0

IN: -483355
OUT: 0

IN: -0xf9ad92
OUT: 0

7
当您说“如果输入的不是有效的十六进制数字”时,它可以是什么类型的东西?不同基数的数字?非数字对象?某些使程序崩溃的对象可能会以无法捕获的方式进行评估?确实,我会建议完全避免输入验证。感觉就像是变色龙的挑战
xnor

2
从测试用例中推断规则不可行的,因为不清楚,很可能会解决挑战。除此之外,这些例子对我来说还不清楚。“#0ac4”使得似乎可以包含任何额外的字符。
xnor

1
编辑后我仍然不清楚哪些输入是可能的。是否#0ac4仍然有效的测试用例?
xnor

5
您的第二个测试用例与您的正则表达式不匹配(X为大写)。
Dada

1
我们需要注意前导零吗?我们可以输出类似吗00011010
user41805 '17

Answers:


3

Pyth,15个字节

.B&qr0<z2"0x"vz

说明:

             vz  Evaluate the input as a literal, to get a number (casts to integer for hexadecimal input)
      <z2        Select the first two characters of (string) input
    r0           cast to lowercase (0X -> 0x)
   q     "0x"    check whether the text starts with "0x" or "0X" (negative numbers don't) 
  &              If it does, return the casted number
.B               and convert to binary string

测试套件

通过0x在OP中阐明规则(必须为小写),可以删除r013个字节。

.B&q<z2"0x"vz


2

05AB1E,11个字节

Î2£„0xQi¹Hb

在线尝试!

说明

Î             # initialize stack with 0 and push input
 2£           # get the first 2 chars of input
   „0xQ       # compare to "0x"
       i      # if equal
        ¹H    # convert input from base-16 to base-10
          b   # convert to binary

不适用于测试用例0XFF
Okx

@Okx:正则表达式和问题的输入部分都指出正确的输入始于0x所以我说特定的测试用例是错误的。
Emigna

1
是的,我没有注意到。
Okx


1

批处理,402字节

@echo off
set/ps=
set r=0
if not %s:~0,2%==0x goto g
if %s%==0x goto g
if %s:0=%==x goto g
set t=%s%
for %%h in (0 1 2 3 4 5 6 7 8 9 a b c d e f)do call set t=%%t:%%h=%%
if not %t%==x goto g
set s=%s:~2%
for %%h in (0.0000 1.0001 2.0010 3.0011 4.0100 5.0101 6.0110 7.0111 8.1000 9.1001 a.1010 b.1011 c.1100 d.1101 e.1110 f.1111)do call set s=%%s:%%~nh=%%~xh%%
set r=%s:.=%
:g
echo %r:*1=1%

在STDIN上输入。然后,大部分8行被浪费在输入验证上,所以有趣的是第11行,它用等效的二进制数替换了每个十六进制数字,但是由于批处理的限制,前导.,第12行删除了所有.s,第14行,删除前导0。但是,对于像0x0这样的输入,这将失败,因此我将使输出“ 0”的输入“无效”。


1

PHP,66 65 63字节

<?=decbin(hexdec(preg_filter("#^0x([a-f\d]+$)#i","$1",$argn)));

与一起运行-F

如果没有0x,最糟糕的问题是,无论hexdecbase_convert简单地忽略不是十六进制字符; 但是有了它,无论如何必须进行显式的有效性检查。


45个字节,不带0x

<?=decbin(ctype_xdigit($argn)*hexdec($argn));

echo stristr($a=$argn,"0X")==$a?decbin(hexdec(ltrim($a,Xx0))):0;这是一个不错的选择吗?它应该工作给定的测试用例
约尔格Hülsermann

@JörgHülsermann:It'sa不错的选择,并且it's工作都给予测试用例,但它并没有检查有效性的十六进制值(见我的评论hexdecbase_convert)。
泰特斯

我知道,我认为问题是给定测试用例的玩笑。
—JörgHülsermann17年

1
echo decbin(hexdec(preg_filter("#^0x([a-f\d]+$)#i","$1",$argn)));
Christoph'Apr

-2字节<?=istead的echo 与-F选项
约尔格Hülsermann

0

的JavaScript(ES6),109 108个字节

适用于任何输入大小。

s=>/1.*|0$/.exec((/^0x([\da-f]+)$/i.exec(s)||'_0')[1].replace(/./g,d=>(+`0x1${d}`).toString(2).slice(1)))[0]

测试用例


嗯... 2名经验丰富的高尔夫球手提交JS解决方案的时间是我的两倍以上,而一直在想我是否在挑战中错过了某些东西。
毛茸茸的

@Shaggy这一切都取决于对挑战第一行的解释。我理所当然地认为“任何大小”都是一个确定的要求-尼尔显然也是如此。
Arnauld

@Shaggy只是为了向大家澄清:您的方法最多0x1fffffffffffff也可以使用Number.MAX_SAFE_INTEGER-并返回超出此范围的四舍五入结果。幸运的是,两个大型测试用例已正确舍入。
Arnauld

didn,我没有意识到@Shaggy的代码是偶然产生的;我想我应该已经计算出结果的第一位和最后一位之间的距离1。顺便说一句,您是否需要$在第一个正则表达式中使用?
尼尔,

@Neil我想我不能摆脱它$。想法是如果结果根本不存在1,则得到最终的零。
Arnauld



0

perl,25岁

(代码24 + 1标志-n)

printf"%8b",/^0x/i?hex:0

0

的JavaScript(ES6),116个 111字节

f=
s=>/^0x[\da-f]+$/i.test(s)?s.replace(/./g,c=>parseInt(4+c,36).toString(2).slice(-4)).replace(/0+10*(.)/,'$1'):0
<input oninput=o.textContent=f(this.value)><pre id=o>0

不限于53位精度。编辑:通过重写我的数字转换节省了5个字节,这也将我的语言要求降低到ES6。


通过将每个字符评估为十六进制值,可以将长度减少13个字节。在线尝试
fəˈnɛtɪk 17-4-20

@ fəˈnɛtɪk不能解决所提出的问题。
尼尔,

在这里,我从第一次转换中删除了前导零,仍要短2个字节。
fəˈnɛtɪk

@ fəˈnɛtɪk我将其与Arnauld的答案结合在一起,得出103:在线试用!
尼尔

@ fəˈnɛtɪk等待,这对第五个测试用例不起作用0x00101011,对不起。
尼尔,

0

8086机器代码-63字节

适用于最多125个字符的任何输入(DOS中的最大命令行长度)

00000000  be 82 00 bf 3f 01 89 fa  ad 3d 30 78 75 24 ac 3c  |....?....=0xu$.<|
00000010  0d 74 22 2c 30 3c 09 76  08 24 df 2c 07 3c 0f 77  |.t",0<.v.$.,.<.w|
00000020  11 b1 04 c1 e0 0c d0 e4  0f 92 c0 0c 30 aa e2 f6  |............0...|
00000030  eb dc ba 3d 01 b0 24 aa  b4 09 cd 21 c3 30 24     |...=..$....!.0$|
0000003f

0

JavaScript(ES6),53 52 49 50 52 45字节

(不竞争,因为它无法处理任何大小的输入;我只是对示例输入感到幸运)

f=

h=>+/^0x[\da-f]+$/i.test(h)&&(+h).toString(2)

console.log(f`0x12`);
console.log(f`0XFF`);
console.log(f`#0ac4`);
console.log(f`0x00101011`);
console.log(f`0x525600`);
console.log(f`0x58f70555118ec400`);
console.log(f`0x6669795966AF3000`);
console.log(f`0b018474`);
console.log(f`9577383`);
console.log(f`-483355`);
console.log(f`-0xf9ad92`);


0

CJam,24字节

q2/("0x"={seu:~Gb2bo}&;0

在线尝试!

说明

q      e# Read the input
2/     e# Split it into 2-length segments
(      e# Pull out the first segment
"0x"=  e# Check if it equals "0x"
{      e# If it does, run this block:
 s     e#  Join the segments back together
 eu    e#  Make the string uppercase
 :~    e#  Eval each character (A-K are 10-20)
 Gb    e#  Convert from base 16 to base 10
 2b    e#  Convert to base 2
 o     e#  Output the binary number
}&     e# (end of block)
;0     e# Delete the top stack element and push 0. If the block was run, nothing is left
       e# on the stack, so the program terminates with an error before pushing 0.

0

JavaScript(ES6),107个字符

f=
b=>/0x[\da-f]+$/i.test(b)&&b.match(/[\da-f](?!x)/gi).map(x=>((+('0x1'+x)).toString(2)).slice(-4)).join('')||0

console.log(f('0x1f'))
console.log(f('0x6669795966AF3000'))



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.