রুবিতে কোনও স্ট্রিং বা পূর্ণসংখ্যাকে বাইনারি রূপান্তর করবেন কীভাবে?


168

আপনি বাইনারি স্ট্রিংগুলিতে ইন্টিজারার 0..9 এবং গণিত অপারেটরগুলি কীভাবে তৈরি করেন? উদাহরণ স্বরূপ:

 0 = 0000,
 1 = 0001, 
 ...
 9 = 1001

কোনও লাইব্রেরি ব্যবহার না করে রুবি ১.৮. with নিয়ে এটি করার কোনও উপায় আছে কি?


আপনি যখন বলছেন আপনি গণিত অপারেটরগুলিকে বাইনারি স্ট্রিংয়ে রূপান্তর করতে চান, আপনার সঠিক অর্থ কী? বাইনারি লিখিত ASCII উপস্থাপনা ব্যবহার করবেন?
বিটিএ

আমার ধারণা আপনি জনপ্রিয় জেনেটিক অ্যালগোরিদম জিনিসটি করতে চেয়েছিলেন? :-)
নেমেসিসফিক্সেক্স

উত্তর:


372

আপনার কাছে Integer#to_s(base)এবং আপনার কাছে String#to_i(base)উপলব্ধ।

Integer#to_s(base) দশমিক সংখ্যাকে নির্দিষ্ট বেসের সংখ্যার প্রতিনিধিত্ব করে স্ট্রিংয়ে রূপান্তর করে:

9.to_s(2) #=> "1001"

বিপরীতটি যখন এর সাথে প্রাপ্ত হয় String#to_i(base):

"1001".to_i(2) #=> 9

24
@ টমআরভেনস্ক্রফ্ট এছাড়াও, আপনি নির্দিষ্ট সংখ্যক বিট ব্যবহার করতে ("%08b" % int)বা ("%08b" % string)ফিরিয়ে দিতে পারেন।
ক্ষয়

1
ব্রিলিয়ান্ট মাইক, ব্রিলিয়ান্ট রুবি!
টেমর শ্ল্যাশ

4
-9.to_s(2) => "-1001"কেউ এই ব্যাখ্যা করতে পারেন?
ব্যবহারকারী1201917

1
আমার মতো @ ক্ষয়ের কোডে বিভ্রান্ত ব্যক্তিদের জন্য, তিনি ' স্প্রিন্টফ
টেলর লিস

@ user1201917 এতে কী দোষ আছে? 9হয় 1001বাইনারি হবে।
পছন্দ

41

আমি অনুরূপ একটি প্রশ্ন জিজ্ঞাসা । @ সাবাবের উত্তরের ভিত্তিতে , বাইনারি বিন্যাসে একটি স্ট্রিংয়ের মধ্যে একটি পূর্ণসংখ্যা উপস্থাপনের সর্বাধিক সংক্ষিপ্ত উপায় হ'ল স্ট্রিং বিন্যাসটি ব্যবহার করা:

"%b" % 245
=> "11110101"

আপনি স্ট্রিং প্রতিনিধিত্ব কত দীর্ঘ করতে পারেন তা বেছে নিতে পারেন, আপনি যদি নির্দিষ্ট-প্রস্থের বাইনারি সংখ্যার তুলনা করতে চান তবে কার্যকর হতে পারে:

1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010

6
বাইনারি স্ট্রিংয়ে পূর্ণসংখ্যাগুলি রূপান্তর করতে আমি কিছু স্থানীয় পরীক্ষা করেছিলাম, তবে ফলাফলটি দেখায় যে কোডগুলি এর 245.to_s(2)চেয়ে দ্রুততর হবে"%b" % 245
গ্রিন সু

এছাড়াও এটি নেতিবাচক মানগুলির সাথে সঠিকভাবে কাজ করে না।
অ্যালেক্স

21

বিটিএর অনুসন্ধান সারণী ধারণাটি তুলে ধরে আপনি একটি ব্লক দিয়ে লুকিং টেবিলটি তৈরি করতে পারেন। মানগুলি যখন প্রথম অ্যাক্সেস করা হয় এবং পরে সংরক্ষণ করা হয় তখন তা উত্পন্ন হয়:

>> lookup_table = Hash.new { |h, i| h[i] = i.to_s(2) }
=> {}
>> lookup_table[1]
=> "1"
>> lookup_table[2]
=> "10"
>> lookup_table[20]
=> "10100"
>> lookup_table[200]
=> "11001000"
>> lookup_table
=> {1=>"1", 200=>"11001000", 2=>"10", 20=>"10100"}

11

আপনি প্রাকৃতিকভাবে ব্যবহার করতে পারেন Integer#to_s(2), String#to_i(2)বা "%b"একটি বাস্তব প্রোগ্রামে, তবে, আপনি যদি অনুবাদটি কীভাবে কাজ করেন সে বিষয়ে আগ্রহী হন, এই পদ্ধতিটি বেসিক অপারেটরগুলি ব্যবহার করে প্রদত্ত পূর্ণসংখ্যার বাইনারি উপস্থাপনা গণনা করে:

def int_to_binary(x)
  p = 0
  two_p = 0
  output = ""

  while two_p * 2 <= x do
    two_p = 2 ** p
    output << ((two_p & x == two_p) ? "1" : "0")
    p += 1
  end

  #Reverse output to match the endianness of %b
  output.reverse
end

এটি কাজ করে তা পরীক্ষা করতে:

1.upto(1000) do |n|
  built_in, custom = ("%b" % n), int_to_binary(n)
  if built_in != custom
    puts "I expected #{built_in} but got #{custom}!"
    exit 1
  end
  puts custom
end

4

আপনি যদি কেবল একক সংখ্যা 0-9 দিয়ে কাজ করছেন তবে এটি দেখার টেবিলটি তৈরি করা সম্ভবত দ্রুততর হবে যাতে আপনাকে প্রতিবার রূপান্তর ফাংশন কল করতে হবে না।

lookup_table = Hash.new
(0..9).each {|x|
    lookup_table[x] = x.to_s(2)
    lookup_table[x.to_s] = x.to_s(2)
}
lookup_table[5]
=> "101"
lookup_table["8"]
=> "1000"

কোনও সংখ্যার পূর্ণসংখ্যা বা স্ট্রিং উপস্থাপনা ব্যবহার করে এই হ্যাশ টেবিলের সূচীকরণটি স্ট্রিং হিসাবে এর বাইনারি প্রতিনিধিত্ব করবে।

আপনার যদি বাইনারি স্ট্রিংগুলি নির্দিষ্ট সংখ্যার দীর্ঘ দীর্ঘ হতে হয় (শীর্ষস্থানীয় জিরো রাখুন), তবে পরিবর্তিত x.to_s(2)হন sprintf "%04b", x(যেখানে 4ব্যবহারের জন্য সর্বনিম্ন সংখ্যার সংখ্যা রয়েছে) to


@ বিটিএ- আমি এই সমস্ত অক্ষরগুলিকে বাইনারিতে এনকোড করছি যাতে আমি এগুলি জেনেটিক অ্যালগরিদমে ব্যবহার করতে পারি। আমি সত্যিই এনকোড / ডিকোডের জন্য দেখার টেবিলের ধারণাটি পছন্দ করি যেহেতু সেটটি 0..9 এবং + - * /
এমকামোনিতে

2

আপনি যদি কোনও রুবি শ্রেণি / পদ্ধতি সন্ধান করছেন তবে আমি এটি ব্যবহার করেছি এবং আমি পরীক্ষাগুলিও অন্তর্ভুক্ত করেছি:

class Binary
  def self.binary_to_decimal(binary)
    binary_array = binary.to_s.chars.map(&:to_i)
    total = 0

    binary_array.each_with_index do |n, i|
      total += 2 ** (binary_array.length-i-1) * n
    end
    total
   end
end

class BinaryTest < Test::Unit::TestCase
  def test_1
   test1 = Binary.binary_to_decimal(0001)
   assert_equal 1, test1
  end

 def test_8
    test8 = Binary.binary_to_decimal(1000)
    assert_equal 8, test8
 end

 def test_15
    test15 = Binary.binary_to_decimal(1111)
    assert_equal 15, test15
 end

 def test_12341
    test12341 = Binary.binary_to_decimal(11000000110101)
    assert_equal 12341, test12341
 end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.