32-বিট ইন্টিজারের বিপরীতে বিট অর্ডার


21

একটি 32-বিট পূর্ণসংখ্যার বিট ক্রমটি বিপরীতে সংক্ষিপ্ততম কোডটি লিখুন।

নিয়মাবলী:

  1. আপনার ভাষা যদি সংখ্যাসূচক মানগুলি (যেমন উইন্ডোজ ব্যাচ) সমর্থন করে না তবে ইনপুটটি একটি বৈধ পূর্ণসংখ্যা বা স্ট্রিং সমতুল্য হিসাবে ধরে নেওয়া হয়।
  2. আউটপুট অবশ্যই একটি বৈধ পূর্ণসংখ্যা বা স্ট্রিং সমতুল্য হতে পারে যদি আপনার ভাষা সংখ্যাসূচক মানগুলিকে সমর্থন করে না (যেমন উইন্ডোজ ব্যাচ)।
  3. শুধুমাত্র স্ট্যান্ডার্ড লাইব্রেরি।
  4. এটি কোনও ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম হতে পারে।
  5. ইনপুট হয় stdinফাংশন আর্গুমেন্ট থেকে বা হতে পারে ।
  6. আউটপুট অবশ্যই হয় stdoutবা প্রত্যাবর্তিত মান হিসাবে হওয়া উচিত ।
  7. যদি আপনার ভাষার অভ্যন্তরীণ বা মানক গ্রন্থাগার ফাংশন থাকে যা এটি এক ধাপে করে (যেমন rbitএআরএম সমাবেশে), এটি ব্যবহার করা যায় না।

উদাহরণ:

চাবি:

  1. দশমিক
    • বাইনারি
    • (বিপরীত)
    • বিপরীত বাইনারি
    • দশমিক আউটপুট

উদাহরণ:

  1. -90 (প্রদর্শনের জন্য 8-বিট উদাহরণ)

    • 10100110b
    • (বিপরীত)
    • 01100101b
    • 101
  2. 486

    • 00000000000000000000000111100110b
    • (বিপরীত)
    • 01100111100000000000000000000000b
    • 1736441856
  3. -984802906

    • 11000101010011010001100110100110b
    • (বিপরীত)
    • 01100101100110001011001010100011b
    • 1704506019

দ্রষ্টব্য: নিষেধাজ্ঞাগুলি বিনামূল্যে গেম। যদি আমি এটি না বলে থাকি এবং এটি স্ট্যান্ডার্ড ফাঁকগুলির মধ্যে একটি না হয় তবে এটি সম্পূর্ণরূপে অনুমোদিত।


"বাদ দেওয়া ফ্রি গেম" এর "বাদ দেওয়া" বলতে কী বোঝায়?
টড লেহম্যান

1
বিধিগুলিতে স্পষ্টভাবে কিছু বলা হয়নি।
ইসিয়া মিডোস

একটি 16 জিবি স্ট্যাটিক টেবিল প্রোগ্রাম দৈর্ঘ্যের অংশ হিসাবে গণনা করা হবে?
হট লিকস

@ হটলিক্স প্রোগ্রামের সাধারণ ব্যাখ্যা অনুসারে, হ্যাঁ।
FUZxxl

যে ভাষাটি কেবল 8-বিট ইনপুট সমর্থন করে, আমরা কি চারটি 8-বিট সংখ্যা হিসাবে ইনপুট নিতে পারি?
স্পার

উত্তর:


0

x86 সমাবেশ, 9 বাইট

    xor eax, eax
    inc eax
myloop:
    shr ecx, 1
    adc eax, eax
    jnc short myloop

বাইট আকারে:, 33 C0 40 D1 E9 13 C0 73 FA9 বাইট।


এটি আবার আমার সমাধান হিসাবে ঠিক দীর্ঘ যদি আপনি (ক) সিডিসিএল কলিং কনভেনশন মানেন এবং (খ) আসলে ফাংশন থেকে ফিরে আসেন।
FUZxxl

@FUZxxl একরকম, আমি আপনার সংস্করণটি দেখিনি। আপনি সম্পূর্ণ সঠিক। আমি ভাবছিলাম __fastcallএবং ছিল না ret
মায়রিয়া

24

এমএমআইএক্স সমাবেশ (২৮ বাইট)

64 বিট সংখ্যা

rbit:
    SETH $1,#0102 # load matrix in 16-byte steps
    ORMH $1,#0408
    ORML $1,#1020
    ORL  $1,#4080
    MOR  $0,$1,$0 # multiplication 1
    MOR  $0,$0,$1 # multiplication 2
    POP  1,0      # return

এটি এখানে একত্রিত হয়:

rbit:
    E0010102 # SETH $1,#0102
    E9010408 # ORMH $1,#0408
    EA011020 # ORML $1,#1020
    EB014080 # ORL  $1,#4080
    DC000100 # MOR  $0,$1,$0
    DC000001 # MOR  $0,$0,$1
    F8010000 # POP  1,0

এটা কিভাবে কাজ করে?

MORনির্দেশ দুই 64-বিট Booleans দুই 8x8 ম্যাট্রিক্স হিসাবে ব্যবহার পরিমাণে উপর একটি ম্যাট্রিক্স গুণ সম্পাদন করে। Abcdefghklmnopqr 2 সংখ্যার সাথে একটি বুলিয়ান নম্বরটি এই জাতীয় ম্যাট্রিক্স হিসাবে ব্যবহৃত হয়:

/ abcd \
| efgh |
| klmn |
\ opqr /

MORনির্দেশ তা বৃদ্ধি পায় ম্যাট্রিক্স তাদের আর্গুমেন্ট যেখানে গুণ দ্বারা প্রতিনিধিত্ব andএবং সংযোজন or। এটাই:

/ 0001 \      / abcd \      / opqr \
| 0010 |  \/  | efgh |  --  | klmn |
| 0100 |  /\  | klmn |  --  | efgh |
\ 1000 /      \ opqr /      \ abcd /

এবং আরো কিছু:

/ opqr \      / 0001 \      / rqpo \
| klmn |  \/  | 0010 |  --  | nmlk |
| efgh |  /\  | 0100 |  --  | hgfe |
\ abcd /      \ 1000 /      \ dcba /

যা মূল সংখ্যার বিটের বিপরীত ক্রম।

32 বিট সংখ্যা

আপনি যদি 64 বিটের সংখ্যার পরিবর্তে 32 বিট সংখ্যার বিপরীত চান তবে আপনি এই পরিবর্তিত পদ্ধতিটি ব্যবহার করতে পারেন:

rbit:
    SETL   $1,#0408 # load first matrix in two steps
    ORML   $1,#0102
    MOR    $1,$1,$0 # apply first matrix
    SLU    $2,$1,32 # compile second matrix
    16ADDU $1,$2,$1
    MOR    $1,$0,$1 # apply second matrix
    POP    1,0      # return

একত্র:

rbit:
    E3010408 # SETL   $1,#0408
    EA010102 # ORML   $1,#0102
    DC010001 # MOR    $1,$1,$0
    3B020120 # SLU    $2,$1,32
    2E010201 # 16ADDU $1,$2,$1
    DC010001 # MOR    $1,$0,$1
    F8010000 # POP    1,0

প্রথম ম্যাট্রিক্সের গুণটি মূলত এর মতো কাজ করে:

/ 0000 \      / 0000 \      / 0000 \
| 0000 |  \/  | 0000 |  --  | 0000 |
| 0001 |  /\  | abcd |  --  | efgh |
\ 0010 /      \ efgh /      \ abcd /

সংশ্লিষ্ট অষ্টাবাইট হ'ল #0000000001020408যা আমরা প্রথম দুটি নির্দেশাবলীতে লোড করি। দ্বিতীয় গুণটি এরকম দেখাচ্ছে:

/ 0000 \      / 0001 \      / 0000 \
| 0000 |  \/  | 0010 |  --  | 0000 |
| efgh |  /\  | 0100 |  --  | hgfe |
\ abcd /      \ 1000 /      \ dcba /

সংশ্লিষ্ট অক্টবাইটটি #0102040810204080আমরা প্রথম ম্যাট্রিক্স থেকে এটির মতো তৈরি করি:

SLU $2,$1,#32   # $2 = #0102040800000000
16ADDU $1,$2,$1 # $2 = $2 + $1 << 4
                     = $2 + #0000000010204080
                #    = #0102040810204080

দ্বিতীয় গুণটি যথারীতি ব্যবসা হয়, ফলস্বরূপ কোডটি একই দৈর্ঘ্য (28 বাইট) থাকে।


1
প্রথমবারের মতো আমি কোনও সিপিইউতে ম্যাট্রিক্সের গুণ গুণ সম্পর্কে শুনি
ফুকলিভ

@ লুভানহফ্যাক: ম্যাট্রিক্সের গুণ নয়, ভ্যাক্সের একটি বহুবর্ষের মূল্যায়ন করার জন্য একটি নির্দেশনা ছিল ।
নিনেও

1
@ এননিওনিও POLYভ্যাক্সের নির্দেশনাটি মূলত একটি বিল্টিন লুপের সাথে একটি ফিউজড গুণিত এবং যোগ করুন। আধুনিক স্থাপত্যগুলিতে অনুরূপ জিনিসগুলিও রয়েছে (x86 এর মতো), তবে একবারে পুরো পলিনোমিয়ালের মূল্যায়ন করার জন্য তাদের সাধারণত বিল্টিন লুপ থাকে না।
FUZxxl

12

80386 সমাবেশ ( 13 12 বাইট)

সিডিসিএল কলিং কনভেনশন ব্যবহার করে এটি অ্যান্ড টি সিনট্যাক্স হিসাবে একটি ক্রিয়াকলাপ।

    # reverse bits of a 32 bit word
    .text
    .globl rbit
    .type rbit,@function
rbit:
    push $32       # prepare loop counter
    pop %ecx
0:  shrl 4(%esp)   # shift lsb of argument into carry flag
    adc  %eax,%eax # shift carry flag into lsb
    loop 0b        # decrement %ecx and jump until ecx = 0
    ret            # return

এই ফাংশনটি নিম্নলিখিত বাইট ক্রমের সাথে একত্রিত হয়:

6a 20 59 d1 6c 24 04 11 c0 e2 f8 c3

নির্দেশাবলীতে ভেঙে দেওয়া:

6a 20       push $32
59          pop %ecx
d1 6c 24 04 shrl 0x4(%esp)
11 c0       adc  %eax,%eax
e2 f8       loop .-6
c3          ret    

এটি এর মতো কাজ করে: লুপের 32 টি পুনরাবৃত্তের প্রত্যেকটিতে, যুক্তিটি, যা অবস্থিত 4(%esp), ডানদিকে একটি অবস্থান দ্বারা স্থানান্তরিত হয়। শেষ বিট সুস্পষ্টভাবে বাহিত পতাকাটিতে স্থানান্তরিত হয়। adcনির্দেশ দুটি মানের যোগ করা হয়েছে এবং ফলাফল পতাকা বহন মান যোগ করে। আপনি যদি নিজের মধ্যে একটি মান যুক্ত করেন, অর্থাত্ %eax, আপনি কার্যকরভাবে এটিকে একটি অবস্থান দ্বারা বাম-শিফট করেন। ফলে adc %eax,%eaxবাম স্থানান্তর করার জন্য একটি সুবিধাজনক উপায় %eaxকম-অর্ডার বিট মধ্যে পতাকা বহন বিষয়বস্তুর নাড়াচাড়া করার সময় এক অবস্থান দ্বারা।

আমি এই প্রক্রিয়াটি 32 বার পুনরাবৃত্তি করি যাতে সম্পূর্ণ সামগ্রীতে 4(%esp).ুকিয়ে দেওয়া হয় %eax%eaxএর আগের বিষয়বস্তুগুলি লুপের সময় স্থানান্তরিত হওয়ায় আমি স্পষ্টভাবে আরম্ভ করতে পারি না ।


+1 আপনার শেষ বাক্যটির জন্য ধন্যবাদ, এটি এখন সুস্পষ্ট তবে আমি এটি মিস করেছি।
edc65

1
আমি এখানে সমাবেশ সংক্রান্ত সমাধানগুলি দেখতে সর্বদা খুশি :)
ব্যবহারকারী1354557

8

সি,    63    52   48

মূল সংস্করণ:

int r(int n){int r=0,i=32;for(;i--;r=r<<1|n&1,n>>=1);return r;}

আপডেট হওয়া সংস্করণ ( অ্যালবার্ট , এস 1024 এবং ডেনিস দ্বারা পরিবর্তনগুলি সহ ):

r(n){int r,i=32;for(;i--;r=r*2|n&1,n>>=1);return r;}

দ্রষ্টব্য: দ্বিতীয় সংস্করণটি সেটিংটি বাদ দেয় r=0তাই কোডটি ধরে নেওয়া হয় যে intএটি 32 বিট। যদি এই অনুমানটি মিথ্যা rহয় তবে ফাংশনে প্রবেশের প্রাথমিক অবস্থার উপর নির্ভর করে ফাংশনটি সম্ভবত একটি ভুল ফলাফল তৈরি করবে ।


চূড়ান্ত সংস্করণ ( ডেনিস এবং অ্যালকিমিস্ট দ্বারা প্রস্তাবিত আরও পরিবর্তন সহ ):

r(n,r,i){for(;32-i++;r=r*2|n&1,n>>=1);return r;}

দ্রষ্টব্য: এটি কাজের ভেরিয়েবলগুলির ঘোষণা rএবং iপ্যারামিটার তালিকায় রাখে। প্যারামিটারগুলি নিম্নরূপ: nবিট-রিভার্স করার সংখ্যা। rএবং iওয়ার্ক ভেরিয়েবল যা 0 হিসাবে পাস হতে হবে।


1
আপনি intফাংশনের ধরণটি সরিয়ে ফেলতে পারেন এবং এমন কিছুতেও পরিবর্তন return rকরতে পারেন i=rযেহেতু বেশিরভাগ সি সংকলকগুলি শেষ ক্রিয়াকলাপের ফলাফলটি রিটার্ন রেজিস্টারে ছেড়ে দেয়। এটি আমার জন্য জিসিসি এবং ক্লিলে কাজ করেছে।
Allbeert

1
ব্যবহার করে আপনি অন্য 4 বাইট বন্ধ শেভ পারে r(n){...}পরিবর্তেr(int n){...}
es1024

2
@FUZxxl আপনি ড্রপ না পারেন intমধ্যে int r=0,i=32;যদি না আপনি তাদের ফাংশন শরীর থেকে বের সরানো।
es1024

1
@ ফুজজেক্সএল: আমি যখন ক্লান্ত তখন মন্তব্য করা উচিত নয় ... পাটিগণিতের স্থানান্তর এবং বিভাগ সমান নয়; প্রথম রাউন্ডগুলি শূন্যের দিকে, যখন প্রথম রাউন্ডগুলি নেতিবাচক অসীমের দিকে। -1 >> 1হয় -1হিসাবে এবং 2**31 - 1যখন, নির্মিত LS জন্য -1 / 2হয় 0
ডেনিস

1
@ টড: কোন কারণ আপনি সংজ্ঞায়িত করেন নি rএবং iযুক্তি হিসাবে? আরও তিনটি বাইট সাশ্রয় করবে ...
ডেনিস

5

জুলিয়া 0.2, 33 বাইট

f(n)=parseint(reverse(bits(n)),2)

দেখতে দেখতে যা করে তাই করে।

bitsআপনাকে বিট উপস্থাপনা দেয় (দুজনের পরিপূরককে সম্মান করে)। parseintদুটির পরিপূরক সম্পর্কে চিন্তা করে না তবে 32 বিট পূর্ণসংখ্যা ফেরত দেয়, তাই দু'টির পরিপূরকটি কেবল ওভারফ্লো দ্বারা পরিচালিত হয়।

চেঞ্জলগগুলির মতে, parseintজুলিয়া ০.০ তে ওভারফ্লো সনাক্তকরণ যুক্ত করা হয়েছিল, সুতরাং এটি আর কাজ করতে পারে না।


5
এটি প্রোডাকশন কোড, গল্ফড কোড নয়! এক্সডি আমি অনুমান করি জুলিয়ার ঠিক দুর্দান্ত।
সিজেফুরে

4

পাইথন 2, 50

print int("{:032b}".format(input()%2**32)[::-1],2)

আমার পাইথ সলিউশন হিসাবে ব্যাপকভাবে একই। ইনপুট মোড 2 ** 32 নিন, 32-বিট প্যাডেড বাইনারি রূপান্তর করুন, বিপরীত করুন, বাইনারি স্টিংকে দশমিক এবং মুদ্রণে রূপান্তর করুন।


4

সিজেম, 15 বাইট

li4H#+2bW%32<2b

এটি অনলাইনে চেষ্টা করুন।

"ফ্রি গেম" জোকার ব্যবহৃত: আউটপুটটি সর্বদা স্বাক্ষরবিহীন পূর্ণসংখ্যার হয়।

পরীক্ষার মামলা

$ cjam reverse32.cjam <<< 486; echo
1736441856
$ cjam reverse32.cjam <<< -984802906; echo
1704506019

কিভাবে এটা কাজ করে

li   " Read from STDIN and cast to integer. ";
4H#+ " Add 4 ** 17 to avoid special cases. ";
2b   " Convert into array of digits in base 2. ";
W%   " Reverse the order. ";
32<  " Discard the 33th and all following digits. ";
2b   " Convert the array of digits into an integer. ";

4

জাভাস্ক্রিপ্ট (E6) 37 39 40 50

ফাংশন, নম্বর ইনপুট এবং বিপরীত নম্বর ফিরে দেওয়া। বেশিরভাগ বেসিক অ্যালগরিদম, সম্ভবত কিছু স্মার্ট ট্রিক দিয়ে আরও গল্ফ করা যেতে পারে।

লুপের পরিবর্তে পুনরাবৃত্তি সম্পাদনা করুন

2k*2 পরিবর্তে @bebe পরামর্শ অনুসরণ করুন সম্পাদনা করুনk<<1

3 সম্পাদনা করুন যা আমি একেবারে মিস করেছি: এটি একটি সম্পূর্ণ 32 বিট লুপ, কে আরম্ভ করার দরকার নেই। ধন্যবাদ @FUZxxl

R=(v,b=32,k)=>b?R(v>>1,b-1,k*2|v&1):k

ইহা ছিল

R=v=>{for(k=b=0;b++<32;)k+=k+(v&1),v>>=1;return k}

টেস্ট ফায়ারফক্স কনসোল, অপ পরীক্ষা ব্যবহার নম্বর এবং আরো কিছু র্যান্ডম 16 এবং 32 বিট সংখ্যা

Bin=x=>('0'.repeat(32)+(x<0?-x-1:x).toString(2)).slice(-32).replace(/./g,d=>x>0?d:1-d),
Dec=x=>(' '.repeat(11)+x).slice(-11),
R16=_=>Math.random()*65536|0,  
R32=_=>(Math.random()*65536<<16)|R16(),  
[-90,486,-984802906,R16(),R16(),R16(),R32(),R32(),R32(),R32()]
 .forEach(n=> console.log(Dec(n)+' '+Bin(n)+' '+Dec(R(n))+' '+Bin(R(n))))

পরীক্ষার আউটপুট উদাহরণ

        -90 11111111111111111111111110100110  1711276031 01100101111111111111111111111111
        486 00000000000000000000000111100110  1736441856 01100111100000000000000000000000
 -984802906 11000101010011010001100110100110  1704506019 01100101100110001011001010100011
      45877 00000000000000001011001100110101 -1395851264 10101100110011010000000000000000
      39710 00000000000000001001101100011110  2027487232 01111000110110010000000000000000
      56875 00000000000000001101111000101011  -730136576 11010100011110110000000000000000
-1617287331 10011111100110100010011101011101 -1159439879 10111010111001000101100111111001
-1046352169 11000001101000011110111011010111  -344488573 11101011011101111000010110000011
 1405005770 01010011101111101010111111001010  1408597450 01010011111101010111110111001010
  -35860252 11111101110111001101000011100100   655047615 00100111000010110011101110111111

b=k=0,R=v=>b++<32?R(v>>1,k+=k+(v&1)):kএকক ব্যবহারের জন্য এবং R=(v,b=0,k=0)=>b<32?R(v>>1,b+1,k+k+(v&1)):kপুনর্ব্যবহারযোগ্য হয়
Bebe

@bebe :( আমি পুনরাবৃত্তি ব্যবহার করে আমার উত্তরটি সংশোধন করছিলাম এবং আপনার মন্তব্য পড়তে সব হারিয়েছি ...
এডক 65

2
আপনি 38 বাইট এ থাকেন k<<1হয়ে k*2এবং v>>1হয়ে v/2। এটা 486. জন্য কাজ আমি অন্য পরীক্ষার বিষয় সম্পর্কে জানা আত
Bebe

1
@bebe v / 2 নেতিবাচক সংখ্যার জন্য কাজ করবে না। 486/512 == 0.9 ... এবং 486 >> 9 == 0, কাটা এটি একই। তবে -90/128 == -0.7 ... এবং -90 >> 7 == - 1
edc65

4

x86 একত্রিত, 10 বাইট

   f9                      stc    
   d1 d8            1:     rcr    %eax
   74 05                   je     2f
   d1 d2                   rcl    %edx
   f8                      clc    
   eb f7                   jmp    1b
                    2:

এটি EX এ ইনপুট ধরে নেয়, এডেক্সে আউটপুট। (এছাড়াও, আউটপুট এ্যাক্স শূন্য এবং সিএফ এবং জেডএফ সেট করা আছে, যদি কেউ যত্ন নেয়)

কোনও কাউন্টারের পরিবর্তে, অতিরিক্ত 1 জনকে প্রারম্ভিকভাবে ডেটা-মার্কার হিসাবে চিহ্নিত করা হয়


এটিতে আমার সমাধানের মতো একই আকার রয়েছে যা তিন বাইট বৃহত্তর। আপনি যোগ তাহলে retফাংশন থেকে ফিরে যান এবং cdecl বাস্তবায়ন নির্দেশ (অর্থাত পরিবর্তন rcr %eaxকরতে rcr 4(%esp)এবং rcl %edxকরতে rcl %eax), আপনার জন্য এক অতিরিক্ত বাইট দিয়ে শেষ retএবং মেমরি রেফারেন্সের জন্য দুই বাইট। তবুও, একটি দুর্দান্ত সমাধান।
FUZxxl

3

জে ( 17 15 13 বাইট)

_32#.@|.@{.#:

এটি কী করে তা ব্যাখ্যা করার জন্য এখানে একটি স্পষ্ট সংজ্ঞা দেওয়া আছে:

3 : '#. |. _32 {. #: y'
  1. #: yyপ্রয়োজনীয় হিসাবে অনেক জায়গা ব্যবহার করে বেস 2 নম্বর হিসাবে প্রতিনিধিত্ব করে।
  2. x {. yলাগে |x(মাত্রার x) থেকে আইটেমগুলি yসামনে থেকে, যদি x, ইতিবাচক ফিরে যদি থেকে xনেতিবাচক। আমরা যদি বর্তমানের চেয়ে বেশি আইটেম গ্রহণ করি তবে ফলাফলটি শূন্যের সাথে প্যাড করা হবে। _32 {. #: yকার্যকরভাবে #: y32 বিট প্যাড ।
  3. |. yফ্লিপস y, i। আইটেম ক্রম বিপরীত y
  4. #. yyবেস -২ নম্বর হিসাবে ব্যাখ্যা করে ।


2

পাইথন - 89

def r(n):
 if n<0:n=~n^0xFFFFFFFF
 print int(['','-'][n%2]+'{:032b}'.format(n)[::-1],2)

পাইথন সহজভাবে নেতিবাচক বাইনারি সংখ্যা উপস্থাপন করে -0b{positive_number}। সুতরাং এটি মোকাবেলা করতে, নেগেটিভ সংখ্যাগুলি পরিপূরক করুন এবং তারপরে সমস্ত 1 এর সাথে এক্সওআর করুন।

এর পরে, বিন্যাসের ভিত্তিতে পূর্ণসংখ্যার স্ট্রিং উপস্থাপনা তৈরি করুন {:032b}যা সংখ্যার 32 বিট উপস্থাপনা সরবরাহ করে। অবশেষে, স্ট্রিংটি বিপরীত করুন এবং এটিকে পূর্বে পূর্ণসংখ্যায় পরিণত করুন।

সম্পাদনা

দু'জনের পরিপূরক ইস্যুটি নির্দেশ করার জন্য @ মার্টিন বাটনারকে ধন্যবাদ জানাই । যদি n1 এ শেষ হয় তবে দুটি দ্বারা পরিপূরকগুলির বিপরীত সংস্করণটি নেতিবাচক হবে।

ভাগ্যক্রমে, উপরে বর্ণিত হিসাবে, পাইথন একটি খুব সহজ উপায়ে নেতিবাচক বাইনারি সংখ্যা পছন্দ করে। এছাড়াও ভাগ্যক্রমে পাইথনের intকাজটি তার প্রথম যুক্তিতে argument চ্ছিক সাইন অক্ষরগুলিকে মঞ্জুরি দেয়

সুতরাং এখন, nদুজনের পরিপূরককে সন্তুষ্ট করতে বিজোড় হলে একটি বিয়োগ চিহ্ন যুক্ত করুন ।


@ মার্টিনবাটনার ধন্যবাদ আমি প্রথম সেই সম্ভাবনাটি মিস করেছি। নতুন কোডটি দুটির পরিপূরককে আরও ভালভাবে পরিচালনা করে।
বেটডেমগুইজ

2
আপনি আরও কিছুটা গল্ফ করতে পারেন: ['','-'][n%2]এটি '-'*(n%2)
জাস্টিন

2

পাইথ , 33 32 22

v_%"%032db0"vsc%Q^2 32

ব্যাখ্যা:

                 Q             Evaluated input.
                %Q^2 32        Q mod 2^32. Same 32 bit binary representation as Q.
             vsc%Q^2 32        Convert to binary string, then that to decimal int.
   %"%032db0"vsc%Q^2 32        Pad above number to 32 bits, and append b0.
  _%"%032db0"vsc%Q^2 32        Reverse it.
 v_%"%032db0"vsc%Q^2 32        Eval and print. Due to leading "0b", eval as binary.

Golfs:

33 -> 32: একটি এন্ড-কোটটি সংরক্ষণ করতে বিপরীত হওয়ার আগে যোগে সরানো হয়েছে।

32 -> 22: জটিল যন্ত্রপাতিটির পরিবর্তে Q মড 2 mod 32 ব্যবহার করা হয়েছে। উভয় স্ট্রিংকে একটিতে সংযুক্ত করে।

পরীক্ষার কেস:

$ cat rev_bits 
v_%"%032db0"vsc%Q^2 32

$ ./pyth.py rev_bits <<< -984802906
1704506019

$ ./pyth.py rev_bits <<< 486
1736441856

$ ./pyth.py rev_bits <<< 0
0

এটি কি বড় 32 সংখ্যার 1 টিতে বামতম বিট হিসাবে ফলাফলের সাথে কাজ করে? এই ক্ষেত্রে এটি একটি নেতিবাচক পূর্ণসংখ্যার আউটপুট করা উচিত।
edc65

@ edc65 আমি একটি 32 বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার আউটপুট আউট করছি।
isaacg

2

জিএনইউ ডিসি, 27 বাইট

0?[2~rssr2*+dlsz34>m]dsmx+p

আউটপুট:

$ dc revbits.dc <<< 15
4026531840
$ dc revbits.dc <<< 255
4278190080
$ dc revbits.dc <<< 65535
4294901760
$ dc revbits.dc <<< 4294901760
65535
$ dc revbits.dc <<< 4278190080
255
$ dc revbits.dc <<< 4026531840
15
$ 

বাশ + কোর্টিলস, 45 বাইট

n=`dc -e2do32^n$1p`
dc -e2i`rev<<<${n: -32}`p

আউটপুট:

$ ./revbits.sh 15
4026531840
$ ./revbits.sh 255
4278190080
$ ./revbits.sh 65535
4294901760
$ ./revbits.sh 4294901760
65535
$ ./revbits.sh 4278190080
255
$ ./revbits.sh 4026531840
15
$ 

সি ফাংশন, 89 বাইট

স্ট্যানফোর্ড বিট টুইডলিং হ্যাকস ব্যবহার করে /codegolf//a/36289/11259 হিসাবে একই ধারণা । গল্ফিং জিততে যাচ্ছি না, তবে তা আকর্ষণীয়:

// 89 byte function:
i;r(v){for(i=1;i<32;i*=2)v=v>>i&(1L<<32)/((1<<i)+1)|(v&(1L<<32)/((1<<i)+1))<<i;return v;}

// Test program:
#include <stdio.h>

int main (int argc, char **argv)
{
    printf("r(0x0000000f) = 0x%08x\n", r(0x0000000f));
    printf("r(0x000000ff) = 0x%08x\n", r(0x000000ff));
    printf("r(0x0000ffff) = 0x%08x\n", r(0x0000ffff));
    printf("r(0xffffffff) = 0x%08x\n", r(0xffffffff));
    printf("r(0x0f0f0f0f) = 0x%08x\n", r(0x0f0f0f0f));
    printf("r(0xf0f0f0f0) = 0x%08x\n", r(0xf0f0f0f0));
}

আউটপুট:

$ ./revbits 
r(0x0000000f) = 0xf0000000
r(0x000000ff) = 0xff000000
r(0x0000ffff) = 0xffff0000
r(0xffffffff) = 0xffffffff
r(0x0f0f0f0f) = 0xf0f0f0f0
r(0xf0f0f0f0) = 0x0f0f0f0f
$


2

পিএইচপি, 46 বাইট

অনলাইন সংস্করণ

for(;$i<32;)$t.=$argn>>$i++&1;echo bindec($t);

অথবা

<?=bindec(strrev(sprintf("%064b",$argn<<32)));

substrঅপ্রয়োজনীয় (-12 বাইটস) হয়। এগুলি চালানোর জন্য আপনার উল্লেখ করা উচিত।
তিতাস

1
@ টিটাস আপনি টেস্টকেস চেষ্টা করেছেন -984802906?
জার্গ হালসারম্যান

1
আপনার দ্বিতীয় সংস্করণটি প্রথমটির সাথে মেলানোর জন্য উন্নত করা যেতে পারে:<?=bindec(strrev(sprintf("%064b",$argn<<32)));
ক্রিস্টোফ

@ ক্রিস্টফ খুব সুন্দর উন্নতি আপনাকে ধন্যবাদ
জার্গ হালসারম্যান

1

জেএস 115

ভাল যে এটি মোটেও ভাল লাগছে না: ডি

n=+prompt();alert(eval('0b'+(Array(33).join(0)+(n<0?n>>>0:n).toString(2)).slice(-32).split('').reverse().join('')))

জেএসে ফ্লোরিয়ান এফ এর পদ্ধতিটি 53 বাইট দীর্ঘ:

for(n=+prompt(r=0),i=32;i--;n>>=1)r=r<<1|n&1;alert(r)

1
it may be a functionনিয়ম মানে আপনাকে সতর্ক বা প্রম্পট প্রয়োজন হবে না
slebetman

1

সি শার্প 81 74

int R(int V){int l,r=l=0,i=1;for(;i>0;i*=2)r|=i*(1&V>>(31-l++));return r;}

বিট ক্রিয়াকলাপগুলি যা সম্ভবত সমস্ত প্রোগ্রামিং ভাষায় ছোট করা যায়।

মূলত, সর্বোচ্চ 2 + এর পূর্ণসংখ্যার 2 এর সমস্ত ক্ষমতার মধ্য দিয়ে লুপ করুন (যা দুটিতে শক্তিতে রূপান্তরিত হয়) এবং যেহেতু (2,147,483,647 + 1) = 0 আমি লুপ করতে পারি 0. বিট শিফটটি প্রথমে বিটটি সরানোর জন্য বাম থেকে ডানে ডানদিকে যেতে পারি অবস্থান। সর্বশেষে 32 টি স্থানে ডানদিকে 31 ধাপ এগিয়ে দ্বিতীয়টি 30 টি যায় etc. দাও.

int R(int V)
{
    int l,r=l=0,i=1;
    for(;i>0;i*=2)
        r|=i*(1&(V>>(31-l++)));
    return r;
 }

ছোট জিনিস, তবে আপনি iএটি ঘোষণা করার সময় আপনি আরম্ভ করতে পারবেন এবং i++লুপের জন্য অপসারণ করে একটি বাইট সংরক্ষণ করুন এবং 1&...0 এর ফলাফলের সাথে তুলনা করার পরিবর্তে আপনি যদি বিবৃতিটি পুরোপুরি সরিয়ে ফেলতে পারেন এবং লুপের ভিতরে iফলাফলটি দিয়ে গুণ করতে পারেনr|=i*(1&(V>>(31-l++)));
ভিজ্যুয়ালমেলন

চতুর! আমার মনে হয়েছিল আমি কিছু মিস করছি। ধন্যবাদ!
ওয়াজেজেসি

1

সি # 142

using System;using System.Linq;int f(int n){return Convert.ToInt32(new string(Convert.ToString(n,2).PadLeft(32,'0').Reverse().ToArray()),2);}

সম্প্রসারিত

int f(int n)
{
    return Convert.ToInt32(
        new string(
            Convert.ToString(n, 2)
            .PadLeft(32, '0')
            .Reverse()
            .ToArray()), 2);
}

1

পাইথন - 37

@ Isaacg এর সমাধানের মতো।

f=lambda n:int(bin(n%2**32)[:1:-1],2)

1

সি ++, 160

এটি সংক্ষিপ্ততম নয়, তবে এটি কেবল 24 টি অপারেশন ব্যবহার করে।
হ্যাকারের ডিলাইট বই থেকে নেওয়া।

Golfed:

typedef unsigned U;U R(U&x){U a=-1u/3,b=-1u/5,c=-1u/17,d=65280;x=(x&a)*2|(x/2)&a;x=(x&b)*4|(x/4)&b;x=(x&c)<<4|(x>>4)&c;x=(x<<24)|((x&d)<<8)|((x>>8)&d)|(x>>24);}

Ungolfed:

unsigned R(unsigned x) {
    x = (x & 0x55555555) <<  1 | (x >>  1) & 0x55555555; 
    x = (x & 0x33333333) <<  2 | (x >>  2) & 0x33333333; 
    x = (x & 0x0F0F0F0F) <<  4 | (x >>  4) & 0x0F0F0F0F; 
    x = (x << 24) | ((x & 0xFF00) << 8) | ((x >> 8) & 0xFF00) | (x >> 24); 
    return x; 
} 

1
এটি একটি কোড গল্ফ প্রশ্ন। আপনার সমাধানে অক্ষরের সংখ্যা হ্রাস করার চেষ্টা করুন, ক্রিয়াকলাপের সংখ্যাটি নয়।
FUZxxl

1

হাস্কেল, 145 - কোনও বিটওয়াইজ অপারেশন নেই

বিট-টুইডলিং আমাকে হাস্কেলের বিরোধী হিসাবে আঘাত করে, তাই আমি বিটওয়াইড অপারেটরগুলির কোনও ব্যবহার এড়িয়ে চলি। ফলস্বরূপ প্রোগ্রামটি অবশ্যই স্বল্পতম প্রতিযোগী নয়, তবে আমি ভেবেছিলাম বিট-টুইডলিংয়ের পরিবর্তে গণিতের ব্যবহার অন্তত আকর্ষণীয়।

import Data.Tuple
import Data.List
f m=foldl1((+).(*2))$take 32$(unfoldr(\n->if n==0 then Nothing else Just$swap$divMod n 2)$mod m$2^32)++[0,0..]

ব্যাখ্যা

f m=foldl1((+).(*2))$take 32$(unfoldr(\n->if n==0 then Nothing else Just$swap$divMod n 2)$mod m$2^32)++[0,0..]
    |------5-------|---4----|--------------------------2---------------------------------|----1-----|---3----|
  1. ফলাফলটি 32-বিটের সীমার মধ্যে আনতে মডুলো ব্যবহার করে
  2. 0গুলি এবং 1এর একটি তালিকা তৈরি করে , প্রথমে বার বার 2 দ্বারা বিভাজক করে এবং বাকী অংশটি নিয়ে কমপক্ষে উল্লেখযোগ্য বিট
  3. 0এই তালিকার শেষের দিকে একটি অসীম তালিকাকে সম্মতি জানায়
  4. তালিকার প্রথম 32 টি উপাদানকে ধরে ফেলুন (তালিকাটি আসলে 32 বিট দীর্ঘ হবে তা নিশ্চিত করার জন্য এই শেষ দুটিটি প্রয়োজনীয় ছিল))
  5. ধর্মান্তরিত একটি তালিকা 0এবং 1একটি পূর্ণসংখ্যা অভিমানী মধ্যে সবচেয়ে গুরুত্বপূর্ণ বিট প্রথম (ডবল এবং অ্যাড পুনরাবৃত্তি) করা হয়।

আমি খুব নিশ্চিত নই যে হাস্কেলের "স্ট্যান্ডার্ড লাইব্রেরি" কী তাই আমি ডেটা ধরে নিয়েছিলাম।টুপল এবং ডেটা।লিস্ট ঠিক আছে (তারা বেশ স্ট্যান্ডার্ড)।

এছাড়াও, আউটপুটটি একটি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যার পরিবর্তনের ফলে এটি আমার বাইটের জন্য ব্যয় করতে পারে: আমি এটি "বাদ দেওয়া ফ্রি গেম" এর অধীনে যুক্তি দিচ্ছি।


স্ট্যান্ডার্ড গ্রন্থাগার: ভাষা দিয়ে কি জাহাজ। এর মধ্যে সি, 4000+ ক্লাস এবং জাভাগুলির পদ্ধতিগুলি (বেশিরভাগ অপ্রাসঙ্গিক) এর জন্য সিস্টেম শিরোনাম অন্তর্ভুক্ত রয়েছে।
ইসিয়া মিডোস

1

পিএইচপি, 46 বাইট

অনলাইনে তাদের চেষ্টা করুন

while($i<32)$r=$r*2|$argn>>$i++&1;echo$r;

বিটওয়াইজ ... কমবেশি পাইপ হিসাবে চালান php -nR '<code>'

পিএইচপি, 46 বাইট

while($i<32)$r|=($argn>>$i&1)<<31-$i++;echo$r;

একটি খাঁটি বিটওয়াইস সমাধান; পাইপ হিসাবে চালান -nR

পিএইচপি, 47 59 বাইট

<?=bindec(str_pad(strrev(substr(decbin($argn),-32)),32,0));

অন্য অন্তর্নির্মিত পদ্ধতির; ফাইল সংরক্ষণ করুন এবং পাইপ হিসাবে চালানো -F


0

পার্ল - 60

$_=unpack"N",pack"B*",scalar reverse unpack"B32",pack"N",$_

পি পতাকার জন্য +1 (আমি যদি এই ভুলটি গণনা করছি তবে আমাকে জানান)।

সাথে চালান:

echo 486 | perl -pe'$_=unpack"N",pack"B32",scalar reverse unpack"B32",pack"N",$_'

0

সি ++ 69

int r(int n){int e=0,i=0;for(;i<32;i++)e|=((n>>i)&1)<<31-i;return e;}

@ তবে এগুলি কি e;i;? প্রকারবিহীন ঘোষণাগুলি বৈধ সি ++ নয়। ভেরিয়েবলের জন্য এটি সি
বৈধও

দুঃখিত, দুঃখিত আমি '++' শিরোনামে চিনতে পারি নি। (আমি আপনার দ্বিতীয় বিবৃতিতে একমত
হব না

int r(int n){int e=0,i=0;for(;i<32;)e=e*2|1&n>>i++;return e;}61 বাইট :)
ক্রিস্টোফ

0

আর, 45

f=function(x)packBits(intToBits(x)[32:1],"i")

উদাহরণ:

f(486)
# [1] 1736441856
f(-984802906)
# [1] 1704506019

পাইথন উত্তরগুলি সম্পর্কে সর্বদা লজ্জাজনক। যে অভিশাপ ফাংশন কীওয়ার্ড।


0

রুবি, 43 41 বাইট

def r(n)(0..31).inject(0){|a,b|a*2+n[b]}end

রুবিতে, বন্ধনী সূচক স্বরলিপি (foo [i]) ব্যবহার করে বিটটি নবম স্থানে ফিরে আসে।

--Edit--

injectকার্যকারিতা রিফ্যাক্টরিং কয়েক বাইট শেভ

def r(n)z=0;32.times{|i|z=z*2+n[i]};z;end


0

পার্ল 5: 46

sub r{for(0..31){$a=$a*2|$_[0]&1;$_[0]>>=1}$a}

অভিনব কিছু না। এটি আউটপুট বামে স্থানান্তরিত করে, উত্সটি ডান স্থানান্তরিত করার আগে lsb অনুলিপি করে।



আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.