ค้นหาจำนวนศูนย์นำในจำนวนเต็ม 64 บิต


18

ปัญหา:

ค้นหาจำนวนของศูนย์นำหน้าในจำนวนเต็มแบบ 64 บิต

กฎ:

  • อินพุตไม่สามารถถือเป็นสตริงได้ มันสามารถเป็นอะไรก็ได้ที่การดำเนินการทางคณิตศาสตร์และ bitwise เป็นตัวผลักดันอัลกอริธึม
  • เอาต์พุตควรตรวจสอบความถูกต้องกับการแสดงตัวเลขจำนวนเต็มแบบ 64 บิตของหมายเลขโดยไม่คำนึงถึงภาษา
  • ใช้กฎของรหัสกอล์ฟเริ่มต้น
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ:

การทดสอบเหล่านี้ถือว่าเป็นจำนวนเต็มแบบเต็มของสองส่วน หากภาษา / การแก้ปัญหาของคุณขาดหรือใช้การแทนจำนวนเต็มที่ลงนามแตกต่างกันโปรดโทรออกและแจ้งกรณีทดสอบเพิ่มเติมที่อาจเกี่ยวข้อง ฉันได้รวมกรณีทดสอบบางข้อที่กล่าวถึงความแม่นยำสองเท่า แต่โปรดอย่าลังเลที่จะแนะนำรายการอื่น ๆ ที่ควรแสดง

input                output   64-bit binary representation of input (2's complement)
-1                   0        1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0        1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807  1        0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903  2        0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911  3        0001000011111111111111111111111111111111111111111111111111111111
9007199254740992     10       0000000000100000000000000000000000000000000000000000000000000000
4503599627370496     11       0000000000010000000000000000000000000000000000000000000000000000
4503599627370495     12       0000000000001111111111111111111111111111111111111111111111111111
2147483648           32       0000000000000000000000000000000010000000000000000000000000000000
2147483647           33       0000000000000000000000000000000001111111111111111111111111111111
2                    62       0000000000000000000000000000000000000000000000000000000000000010
1                    63       0000000000000000000000000000000000000000000000000000000000000001
0                    64       0000000000000000000000000000000000000000000000000000000000000000

13
ยินดีต้อนรับสู่ PPCG! อะไรคือเหตุผลที่อยู่เบื้องหลัง"การป้อนข้อมูลที่ไม่สามารถได้รับการปฏิบัติเป็นสตริง" ? สิ่งนี้จะตัดสิทธิ์ทุกภาษาที่ไม่สามารถจัดการกับจำนวนเต็ม 64 บิตและไม่น่าจะนำไปสู่คำตอบเพิ่มเติมที่รับจำนวนเต็มเพราะนี่เป็นวิธีที่ตรงไปตรงมาเมื่อพร้อมใช้งาน
Arnauld

1
เรากลับมาFalseแทนได้0ไหม
Jo King

4
@Arnauld มีคำถามที่คล้ายกันอยู่แล้วที่นี่และในเว็บไซต์อื่น ๆ ที่เรียกร้องให้ใช้วิธีแก้ปัญหาแบบสตริงโดยเฉพาะ แต่ไม่มีสิ่งใดที่เปิดคำถามให้ดำเนินการทางคณิตศาสตร์และตรรกะ ความหวังของฉันคือการเห็นแนวทางที่แตกต่างกันสำหรับปัญหานี้ที่ยังไม่ได้รับคำตอบจากที่อื่น สิ่งนี้ควรถูกเปิดให้กับโซลูชันสตริงรวมถึงแบบรวมหรือไม่?
เดฟ

4
ซีพียูหลายตัวรวมถึง x86 และ ARM มีคำแนะนำเฉพาะสำหรับเรื่องนี้ (x86 มีได้หลายอัน) ฉันสงสัยอยู่เสมอว่าทำไมภาษาการเขียนโปรแกรมไม่ได้แสดงคุณสมบัตินี้เนื่องจากในภาษาการเขียนโปรแกรมส่วนใหญ่ในวันนี้คุณไม่สามารถเรียกใช้คำแนะนำการประกอบ
slebetman

1
@ user202729 ฉันคิดว่าฉันใช้คำนี้ไม่ดี: 'ผลลัพธ์ควรได้รับการตรวจสอบกับการแสดงตัวเลขจำนวนเต็ม 64 บิตโดยไม่คำนึงถึงภาษา' สิ่งที่ฉันหมายถึงคือคำถามนี้กำหนดจำนวนศูนย์เป็นจำนวนศูนย์ ในจำนวนเต็มแบบ 64 บิต ฉันเดาว่าฉันได้ทำข้อ จำกัด ดังกล่าวเพื่อกำจัดจำนวนเต็มที่ลงนามกับไม่ได้ลงนาม
เดฟ

คำตอบ:


41

x86_64 ภาษาเครื่องบน Linux, 6 ไบต์

0:       f3 48 0f bd c7          lzcnt  %rdi,%rax
5:       c3                      ret

ต้องการตัวประมวลผล Haswell หรือ K10 หรือสูงกว่าพร้อมlzcntคำสั่ง

ลองออนไลน์!


20
Builtins โจมตีอีกครั้ง / s
Logern

1
ผมขอแนะนำให้ระบุการประชุมเรียกใช้ (แม้ว่าคุณจะไม่พูดในลินุกซ์)
qwr

@qwr ดูเหมือนว่าการเรียก SysV เนื่องจากพารามิเตอร์ถูกส่งผ่านใน% rdi และจะถูกส่งกลับใน% rax
Logern

24

Hexagony , 78 70 ไบต์

2"1"\.}/{}A=<\?>(<$\*}[_(A\".{}."&.'\&=/.."!=\2'%<..(@.>._.\=\{}:"<><$

ลองออนไลน์!

ความท้าทายนี้ไม่สำคัญเกินไปสำหรับภาษาที่ใช้งานจริงหรือ ;)

ความยาวด้าน 6. ฉันไม่สามารถใส่ในความยาวด้าน 5 เหลี่ยมหกเหลี่ยม

คำอธิบาย


3
ฉันหัวเราะอย่างหนักที่ "คำอธิบาย" : D
Eric Duminil

1
ฉันคิดว่าคุณอาจจัดการตัวเลข / ศูนย์ที่ซับซ้อนได้ง่ายเกินไป ฉันจัดการเพื่อให้พอดีกับโปรแกรมที่คล้ายกันในด้านความยาว 5 โดยไม่ทำการคำนวณที่หนัก 2 ^ 64 เห็นได้ชัดว่ามันยังไม่ดีนักแม้ว่า!
FryAmTheEggman

@fry Ah ถูกต้องตัวเลขลบจะมี 0 เลขศูนย์นำหน้าเสมอ ... ซึ่งจะนำไปสู่โปรแกรมที่สั้นกว่าเพราะการสร้าง 2 ^ 64 นั้นยาว
user202729

12

Pythonขนาด 31 ไบต์

lambda n:67-len(bin(-n))&~n>>64

ลองออนไลน์!

expresson เป็น bitwise &ของสองส่วน:

67-len(bin(-n)) & ~n>>64

67-len(bin(-n))ให้คำตอบที่ถูกต้องสำหรับปัจจัยการผลิตที่ไม่ใช่เชิงลบ ใช้ความยาวบิตและลบออกจาก 67 ซึ่งเป็น 3 มากกว่า 64 เพื่อชดเชย-0bคำนำหน้า การปฏิเสธคือเคล็ดลับในการปรับการn==0ใช้ที่เป็นการปฏิเสธว่าไม่ได้สร้าง-สัญญาณไว้ข้างหน้า

& ~n>>64ทำให้คำตอบแทนที่จะเป็นเชิงลบ0 nเมื่อn<0, ~n>>64เท่ากับ 0 (ในจำนวนเต็ม 64 บิต) 0เพื่อและไอเอ็นจีกับมันให้ เมื่อn>=0ใดที่~n>>64ประเมิน-1และทำ&-1ไม่มีผล


Python 2 , 36 ไบต์

f=lambda n:n>0and~-f(n/2)or(n==0)*64

ลองออนไลน์!

ทางเลือกเกี่ยวกับคณิตศาสตร์


9

Java 8, 32 26 ไบต์

Long::numberOfLeadingZeros

Builtins FTW

-6 ไบต์ขอบคุณ Kevin Cruijssen

ลองออนไลน์!


อ่าลืมเรื่องไปอย่างสิ้นเชิงnumberOfLeadingZeros.. คุณสามารถตีกอล์ฟถึง 28 bytes btw:n->n.numberOfLeadingZeros(n)
Kevin Cruijssen

2
ที่จริงแล้วLong::numberOfLeadingZerosสั้นกว่า (26 ไบต์)
Kevin Cruijssen

6
ว้าวมันไม่ได้เกิดขึ้นบ่อยนักที่จาวาเต้น Python ยินดีด้วย!
Eric Duminil

9

C (gcc) , 14 ไบต์

__builtin_clzl

ทำงานได้ดีบน tio

C (gcc) , 35 29 ไบต์

f(long n){n=n<0?0:f(n-~n)+1;}

ลองออนไลน์!

Than Dennis ราคา 6 ไบต์

ธงคอมไพเลอร์C (gcc) , 29 ไบต์โดย David Foerster

-Df(n)=n?__builtin_clzl(n):64

ลองออนไลน์!


3
น่าสังเกตว่ามันเป็นเพียงสำหรับเครื่อง 64 บิต (หรืออื่น ๆ ที่มี LP64 / ILP64 / ฯลฯ ABI)
Ruslan

1
โธ่ที่แม้สั้นกว่าการใช้ใด ๆGCC ในตัว__builtin_clzlด้วยซึ่งผมสามารถขึ้นมา
David Foerster

@Ruslan: จุดที่ดีในระบบที่longเป็น 32 บิต (รวมถึง Windows x64) คุณต้อง__builtin_clzll(ยาวไม่ได้ลงนาม) godbolt.org/z/MACCKf (ซึ่งแตกต่างจาก intrinsics Intel, GNU C builtins ได้รับการสนับสนุนโดยไม่คำนึงถึงการดำเนินการเป็นไปได้ที่มีการเรียนการสอนเครื่องหนึ่งเมื่อวันที่ 86 x 32 บิต compiles clzll สาขาหรือ cmov ที่จะทำ. lzcnt(low half)+32หรือlzcnt(high half)หรือ. bsrถ้าlzcntไม่สามารถใช้ได้.
ปีเตอร์ Cordes

กรณีทดสอบรวมถึง "0" แต่__builtin_clz(l)(l)เป็นพฤติกรรมที่ไม่ได้กำหนดสำหรับศูนย์: "ถ้า x เป็น 0 ผลลัพธ์จะไม่ได้กำหนด"
MCCCS

1
@MCCCS หากใช้งานได้จะนับ นั่นเป็นเหตุผลที่ฉันตอบคำถามสุดท้าย
l4m2

6

Perl 6 , 35 28 26 ไบต์

-2 ไบต์ต้องขอบคุณ nwellnhof

{to .fmt("%064b")~~/^0*/:}

ลองออนไลน์!

การบล็อกโค้ดแบบไม่ระบุชื่อที่ใช้ตัวเลขและส่งคืนตัวเลข นี่จะแปลงตัวเลขเป็นสตริงไบนารีและนับจำนวนศูนย์นำหน้า มันใช้งานได้กับจำนวนลบเพราะอักขระตัวแรกเป็น-เช่น-00000101ดังนั้นจึงไม่มีเลขศูนย์นำหน้า

คำอธิบาย:

{                        }  # Anonymous code block
    .fmt("%064b")           # Format as a binary string with 64 digits
                 ~~         # Smartmatch against
                   /^0*/    # A regex counting leading zeroes
 to                     :   # Return the index of the end of the match

6

JavaScript (Node.js)ขนาด 25 ไบต์

ใช้อินพุตเป็นตัวอักษร BigInt

f=x=>x<0?0:x?f(x/2n)-1:64

ลองออนไลน์!

0


จะไม่n=>n<1?0:n.toString(2)-64แสดงเหมือนเดิมหรือ
Ismael Miguel

@IsmaelMiguel ฉันคิดว่าคุณหมายถึงn=>n<1?0:n.toString(2).length-64แต่นั่นจะไม่ทำงาน นี้จะผมคิดว่า
Arnauld

1
@IsmaelMiguel ไม่ต้องกังวล :) เป็นไปได้ที่จะมี.toString()วิธีการทำงาน แต่เรายังคงต้องการตัวอักษร BigInt เป็นตัวป้อนข้อมูล มิฉะนั้นเรามีเพียง 52 บิตของ mantissa, นำไปสู่ผลที่ไม่ถูกต้องเมื่อมีความแม่นยำจะหายไป
Arnauld

1
ความจริงที่ว่าคำต่อท้าย BigInt เป็นตัวอักษรเดียวกับที่พารามิเตอร์ของคุณสับสนมาก ...
Neil

1
@Neil รหัสอ่านไม่ได้บน PPCG? นี่เป็นไม่ได้! แก้ไขแล้ว! : p
Arnauld


5

J , 18 ไบต์

0{[:I.1,~(64$2)#:]

ลองออนไลน์!

J , 19 ไบต์

1#.[:*/\0=(64$2)#:]

ลองออนไลน์!

คำอธิบาย:

                #:  - convert 
                  ] - the input to
          (64$2)    - 64 binary digits
         =          - check if each digit equals 
        0           - zero
   [:*/\            - find the running product
1#.                 - sum

1
1#.[:*/\1-_64{.#:(17) ใกล้กัน แต่ไม่สามารถใช้กับจำนวนลบ :(
Conor O'Brien

@ Conor O'Brien วิธีการที่ดีเช่นกัน!
Galen Ivanov



4

05AB1E , 10 9 ไบต์

·bg65αsd*

I / O เป็นจำนวนเต็มทั้งคู่

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

·         # Double the (implicit) input
          #  i.e. -1 → -2
          #  i.e. 4503599627370496 → 9007199254740992
 b        # Convert it to binary
          #  i.e. -2 → "ÿ0"
          #  i.e. 9007199254740992 → 100000000000000000000000000000000000000000000000000000
  g       # Take its length
          #  i.e. "ÿ0" → 2
          #  i.e. 100000000000000000000000000000000000000000000000000000 → 54
   65α    # Take the absolute different with 65
          #  i.e. 65 and 2 → 63
          #  i.e. 65 and 54 → 11
      s   # Swap to take the (implicit) input again
       d  # Check if it's non-negative (>= 0): 0 if negative; 1 if 0 or positive
          #  i.e. -1 → 0
          #  i.e. 4503599627370496 → 1
        * # Multiply them (and output implicitly)
          #  i.e. 63 and 0 → 0
          #  i.e. 11 and 1 → 11

4

Haskell , 56 ไบต์

ขอบคุณxnor ที่จำผิด!

f n|n<0=0|1>0=sum.fst.span(>0)$mapM(pure[1,0])[1..64]!!n

อาจจัดสรรหน่วยความจำได้ค่อนข้างมากลองออนไลน์!

บางทีคุณอาจต้องการทดสอบด้วยค่าคงที่ที่น้อยกว่า: ลอง 8 บิต!

คำอธิบาย

mapM(pure[0,1])[1..64]mapM(pure[1,0])[1..64]{0,1}641sum.fst.span(>0)


3

Powershell, 51 ไบต์

param([long]$n)for(;$n-shl$i++-gt0){}($i,65)[!$n]-1

สคริปต์ทดสอบ:

$f = {

param([long]$n)for(;$n-shl$i++-gt0){}($i,65)[!$n]-1

}

@(
    ,(-1                   ,0 )
    ,(-9223372036854775808 ,0 )
    ,(9223372036854775807  ,1 )
    ,(4611686018427387903  ,2 )
    ,(1224979098644774911  ,3 )
    ,(9007199254740992     ,10)
    ,(4503599627370496     ,11)
    ,(4503599627370495     ,12)
    ,(2147483648           ,32)
    ,(2147483647           ,33)
    ,(2                    ,62)
    ,(1                    ,63)
    ,(0                    ,64)
) | % {
    $n,$expected = $_
    $result = &$f $n
    "$($result-eq$expected): $result"
}

เอาท์พุท:

True: 0
True: 0
True: 1
True: 2
True: 3
True: 10
True: 11
True: 12
True: 32
True: 33
True: 62
True: 63
True: 64

3

Java 8, 38 ไบต์

int f(long n){return n<0?0:f(n-~n)+1;}

อินพุตเป็นlong(จำนวนเต็ม 64- บิต), ส่งออกเป็นint(จำนวนเต็ม 32- บิต)

พอร์ตของ@ l4m2 's C (GCC) คำตอบ

ลองออนไลน์

คำอธิบาย:

 int f(long n){       // Recursive method with long parameter and integer return-type
   return n<0?        //  If the input is negative:
           0          //   Return 0
          :           //  Else:
           f(n-~n)    //   Do a recursive call with n+n+1
                  +1  //   And add 1

แก้ไข: สามารถเป็น26 ไบต์โดยใช้ builtin Long::numberOfLeadingZerosตามที่แสดงใน@lukeg 's Java 8 คำตอบ


3

APL + WIN, 34 ไบต์

+/×\0=(0>n),(63⍴2)⊤((2*63)××n)+n←⎕

คำอธิบาย:

n←⎕ Prompts for input of number as integer

((2*63)××n) If n is negative add 2 to power 63

(63⍴2)⊤ Convert to 63 bit binary

(0>n), Concatinate 1 to front of binary vector if n negative, 0 if positive

+/×\0= Identify zeros, isolate first contiguous group and sum if first element is zero

3

C # (Visual C # Interactive Compiler) , 42 ไบต์

x=>x!=0?64-Convert.ToString(x,2).Length:64

ลองออนไลน์!

C # (Visual C # Interactive คอมไพเลอร์) , 31 ไบต์

int c(long x)=>x<0?0:c(x-~x)+1;

สั้นกว่าเดิมโดยอิงจากคำตอบ C (gcc)ของ @ l4m2 ไม่เคยรู้เลยว่าคุณสามารถประกาศฟังก์ชั่นแบบนั้นได้ขอบคุณ @Dana!

ลองออนไลน์!


1
ฉันคิดว่ามันถูกต้อง? tio.run/##ZZA/…
dana

3

เยลลี่ ,  10  9 ไบต์

-1 ด้วยเคล็ดลับที่ประณีตโดย Erik the Outgolfer (ตอนนี้ไม่ใช่เชิงลบตอนนี้เป็นเพียงแค่)

ḤBL65_×AƑ

ลิงค์ monadic ยอมรับจำนวนเต็ม (ภายในช่วง) ซึ่งให้ผลเป็นจำนวนเต็ม

ลองออนไลน์! หรือดูการทดสอบในตัว


10 รายการคือ ḤBL65_ɓ>-×

นี่เป็นอีกหนึ่งโซลูชั่น 10 ไบต์ซึ่งฉันชอบเพราะมันบอกว่ามันเป็น "BOSS" ...

BoṠS»-~%65

ทดสอบชุดที่นี่

... BoṠS63r0¤i, BoṠS63ŻṚ¤iหรือBoṠS64ḶṚ¤iจะยังทำงาน


อีก 10 byter (จาก Dennis) คือæ»64ḶṚ¤Äċ0(อีกครั้งæ»63r0¤Äċ0และæ»63ŻṚ¤Äċ0จะทำงานด้วย)



@EriktheOutgolfer ฉันคิดกับตัวเองว่า "ต้องมีนักกอล์ฟที่จะทวีคูณโดย isNonNegative" และไม่ได้คิดว่าƑรวดเร็วเลยงานที่ดีมาก ๆ !
Jonathan Allan

1
จริงๆแล้วฉันกำลังตั้งทฤษฎีเกี่ยวกับเรื่องนี้มาระยะหนึ่งแล้ว ได้รับคำเตือนว่ามันไม่ได้เป็นแบบเวกเตอร์! ;-) จริง ๆ แล้ว "แบนแล้วตรวจสอบว่าองค์ประกอบทั้งหมดไม่ใช่ลบ"
Erik the Outgolfer

2

Perl 5 , 37 ไบต์

sub{sprintf("%064b",@_)=~/^0*/;$+[0]}

ลองออนไลน์!

หรือ 46 ไบต์นี้หากไม่อนุญาตให้ใช้ "การทำให้เป็นสตริง": sub z

sub{my$i=0;$_[0]>>64-$_?last:$i++for 1..64;$i}

s/length$&/$+[0]/(-3 ไบต์);)
Dada

IMO คุณไม่ได้รับอนุญาตให้ลบsubคำหลักออกจากคำตอบที่มีฟังก์ชัน Perl 5
nwellnhof

ฉันเห็นสิ่งที่คล้ายกับการลบsubคำตอบสำหรับภาษาอื่น ๆ perl6, powershell และอื่น ๆ
Kjetil S.

ใน Perl6 ฉันคิดว่าคุณไม่จำเป็นต้องsub{}ทำการย่อย (ไม่ระบุชื่อ) ซึ่งอธิบายว่าทำไมมันถูกตัดออกจากคำตอบ Perl6 ผมเห็นด้วยกับ @nwellnhof subที่คุณไม่ควรได้รับอนุญาตให้ลบ (เมื่อฉันยังคงใช้งานเหมือนปีที่แล้วหรือมากกว่านั้นนั่นคือกฎ)
Dada

เปลี่ยนตอนนี้ และรวมอยู่$+[0]ด้วย
Kjetil S.

2

Swift (บนแพลตฟอร์ม 64 บิต), 41 ไบต์

ประกาศปิดที่เรียกว่าที่รับและส่งกลับf Intโซลูชันนี้ใช้งานได้อย่างถูกต้องกับแพลตฟอร์ม 64 บิตซึ่งIntมีtypealiasการInt64แก้ไข (บนแพลตฟอร์ม 32- บิตInt64สามารถใช้อย่างชัดเจนสำหรับประเภทพารามิเตอร์ของการปิดเพิ่ม 2 ไบต์)

let f:(Int)->Int={$0.leadingZeroBitCount}

ใน Swift แม้แต่ชนิดจำนวนเต็มพื้นฐานเป็นวัตถุธรรมดาที่ประกาศในไลบรารีมาตรฐาน ซึ่งหมายความว่าIntสามารถมีวิธีการและคุณสมบัติเช่นleadingZeroBitCount(ซึ่งจำเป็นสำหรับทุกประเภทที่สอดคล้องกับFixedWidthIntegerโปรโตคอลของไลบรารีมาตรฐาน)


น่าสนใจ ทำให้ฉันนึกถึงสนิม ฉันคิดว่ามันควรจะนับเป็น 20 ไบต์, .leadingZeroBitCount
ดอนสดใส

2

Haskell , 24 ไบต์

f n|n<0=0
f n=1+f(2*n+1)

ลองออนไลน์!

นี่เป็นพื้นฐานเหมือนกับโซลูชัน Java ของ Kevin Cruijssen แต่ฉันพบว่าเป็นอิสระ

อาร์กิวเมนต์ควรมีประเภทIntสำหรับบิลด์ 64 บิตหรือInt64อะไรก็ได้

คำอธิบาย

หากอาร์กิวเมนต์เป็นลบผลลัพธ์จะเป็น 0 ทันทีมิเช่นนั้นเราจะเลื่อนไปทางซ้ายเติมด้วยอักขระจนกว่าจะถึงจำนวนลบ การเติมนั้นช่วยให้เราหลีกเลี่ยงกรณีพิเศษสำหรับ 0

เพื่อการอ้างอิงนี่เป็นวิธีที่ชัดเจน / มีประสิทธิภาพ:

34 ไบต์

import Data.Bits
countLeadingZeros



1

Perl 5 -p , 42 ไบต์

1while$_>0&&2**++$a-1<$_;$_=0|$_>=0&&64-$a

ลองออนไลน์!

ยาวกว่าโซลูชันที่อิงกับ bitstring แต่เป็นโซลูชันที่ใช้คณิตศาสตร์ได้ดี


ใช้งานไม่ได้จริง ๆถ้าฉันไม่ผิดพลาด
Dada

@ ดาด้าฉันเห็นว่ามีบางกรณีที่การแบ่งจุดลอยตัวค่อนข้างไม่เหมาะสม ฉันใส่intสายที่ควรแก้ปัญหา
Xcali

ขออภัยฉันทำสำเนาที่ผ่านมาไม่สำเร็จ นี่คือสิ่งที่ฉันต้องการส่ง;)
Dada

1

APL (NARS), 15 ตัวอักษร, 30 ไบต์

{¯1+1⍳⍨⍵⊤⍨64⍴2}

ทดสอบจำนวนน้อยเพื่อดูวิธีใช้:

  f←{¯1+1⍳⍨⍵⊤⍨64⍴2}
  f ¯9223372036854775808
0
  f 9223372036854775807
1


1

K (ngn / k) , 6 ไบต์

64-#2\

ลองออนไลน์!

2\ เข้ารหัสอาร์กิวเมนต์เป็นเลขฐานสอง

# ความยาว

64- ลบออกจาก 64


# = length... ดูเป็นสตริง
Titus

2
@Titus 2\ ให้รายการของจำนวนเต็มและ#ค้นหาความยาว ไม่มีสตริงที่เกี่ยวข้องที่นี่
ngn


1

ภาษา Wolfram (Mathematica) , 41 ไบต์

63-Floor@Log2@#&สูตรสำหรับตัวเลขบวกเป็นเพียง กฎการแทนที่ใช้สำหรับกรณีพิเศษของศูนย์และอินพุตเชิงลบ

อินพุตไม่จำเป็นต้องเป็นจำนวนเต็มแบบ 64 บิต สิ่งนี้จะนำพื้นของอินพุตเพื่อแปลงเป็นจำนวนเต็มอย่างมีประสิทธิภาพ หากคุณป้อนตัวเลขที่อยู่นอกขอบเขตปกติสำหรับจำนวนเต็ม 64 บิตมันจะบอกให้ส่งคืนจำนวนลบซึ่งระบุจำนวนบิตที่จะต้องใช้ในการเก็บจำนวนเต็มนี้

63-Floor@Log2[#/.{_?(#<0&):>2^63,0:>.5}]&

ลองออนไลน์!

วิธีแก้ปัญหาของ @ LegionMammal978 นั้นค่อนข้างสั้นที่ 28 ไบต์ อินพุตต้องเป็นจำนวนเต็ม ต่อเอกสาร: " BitLength[n]ได้อย่างมีประสิทธิภาพรุ่นที่มีประสิทธิภาพของFloor[Log[2,n]]+1." โดยจะจัดการกับกรณีของศูนย์อย่างถูกต้องรายงานมากกว่า0-∞

ภาษา Wolfram (Mathematica)ขนาด 28 ไบต์

Boole[#>=0](64-BitLength@#)&

ลองออนไลน์!


1
Boole[#>=0](64-BitLength@#)&เป็นบิตที่ดีสั้นที่ 28 ไบต์ จะใช้แนวคิดพื้นฐานเช่นเดียวกับคุณ แต่นำไปใช้และBitLength Boole
LegionMammal978

ฉันลืม BitLength โดยสิ้นเชิง!
Kelly Lowder

1

bitNumber - math.ceil (math.log (หมายเลข) / math.log (2))

เช่น 64 บิตหมายเลข: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63


หากคุณสามารถเพิ่มชื่อภาษาลงในนี้ได้ก็คงจะดีเพราะคนมีแนวโน้มที่จะลดคำตอบลงคะแนนที่ไม่มีชื่อภาษารวมอยู่ด้วย
Jono 2906
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.