আপনি বাইনারি স্ট্রিংগুলিতে ইন্টিজারার 0..9 এবং গণিত অপারেটরগুলি কীভাবে তৈরি করেন? উদাহরণ স্বরূপ:
0 = 0000,
1 = 0001,
...
9 = 1001
কোনও লাইব্রেরি ব্যবহার না করে রুবি ১.৮. with নিয়ে এটি করার কোনও উপায় আছে কি?
আপনি বাইনারি স্ট্রিংগুলিতে ইন্টিজারার 0..9 এবং গণিত অপারেটরগুলি কীভাবে তৈরি করেন? উদাহরণ স্বরূপ:
0 = 0000,
1 = 0001,
...
9 = 1001
কোনও লাইব্রেরি ব্যবহার না করে রুবি ১.৮. with নিয়ে এটি করার কোনও উপায় আছে কি?
উত্তর:
আপনার কাছে 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
("%08b" % int)
বা ("%08b" % string)
ফিরিয়ে দিতে পারেন।
-9.to_s(2)
=> "-1001"
কেউ এই ব্যাখ্যা করতে পারেন?
9
হয় 1001
বাইনারি হবে।
আমি অনুরূপ একটি প্রশ্ন জিজ্ঞাসা । @ সাবাবের উত্তরের ভিত্তিতে , বাইনারি বিন্যাসে একটি স্ট্রিংয়ের মধ্যে একটি পূর্ণসংখ্যা উপস্থাপনের সর্বাধিক সংক্ষিপ্ত উপায় হ'ল স্ট্রিং বিন্যাসটি ব্যবহার করা:
"%b" % 245
=> "11110101"
আপনি স্ট্রিং প্রতিনিধিত্ব কত দীর্ঘ করতে পারেন তা বেছে নিতে পারেন, আপনি যদি নির্দিষ্ট-প্রস্থের বাইনারি সংখ্যার তুলনা করতে চান তবে কার্যকর হতে পারে:
1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
245.to_s(2)
চেয়ে দ্রুততর হবে"%b" % 245
বিটিএর অনুসন্ধান সারণী ধারণাটি তুলে ধরে আপনি একটি ব্লক দিয়ে লুকিং টেবিলটি তৈরি করতে পারেন। মানগুলি যখন প্রথম অ্যাক্সেস করা হয় এবং পরে সংরক্ষণ করা হয় তখন তা উত্পন্ন হয়:
>> 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"}
আপনি প্রাকৃতিকভাবে ব্যবহার করতে পারেন 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
আপনি যদি কেবল একক সংখ্যা 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
আপনি যদি কোনও রুবি শ্রেণি / পদ্ধতি সন্ধান করছেন তবে আমি এটি ব্যবহার করেছি এবং আমি পরীক্ষাগুলিও অন্তর্ভুক্ত করেছি:
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