Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyを使った数学:モジュロ演算子、バイナリなど

優れたプログラマーになるには、数学を知る必要がありますか?

状況によって異なります!

一日中CRUDアプリを作成するだけの場合は、数学についてあまり知る必要はないでしょう。

ただし、コーディングの課題を解決したり、コーディングインタビューの準備をしたりするなど、もっと面白いことをしたい場合は、いくつかの基本的な概念を学ぶことが役立ちます。

今日はについて学びます

  • モジュロ演算子(
  • 番号システム
  • ビットマスキング

これらの概念をRubyで適用する方法を学ぶので、これは実用的なガイドになります。

やってみましょう!

Rubyモジュロ演算子

Rubyのモジュロ演算子は次のようになります:

はい、パーセント記号と同じです。

それは何をしますか?

モジュロ演算子は、除算の残りの部分を提供します 。これは、数値が偶数か奇数かを確認するなどの目的で使用できます。

はい。

Rubyには、even?があります。 / odd? メソッド。

8.even?
# true

5.even?
# false

ただし、数値が3で割り切れるかどうかを確認する場合は、モジュロ演算子を使用する必要があります。

9 % 3 == 0
# true

もっと使い方を探りましょう!

モジュロ演算子の実用的な使用法

モジュロを使用して、数値が別の数値で割り切れるかどうかを確認できます。 。

残りが0の場合、数値は割り切れます。

古典的な「FizzBu​​zz」コーディングチャレンジでは、数値が3または5で割り切れるかどうかを確認する必要があります。

if n % 3 == 0
  puts "Fizz"
end

if n % 5 == 0
  puts "Buzz"
end

Modoloを使用できます N回ごとに物事を行うオペレーター。

このように

(1..10).select { |n| n % 2 == 0 }
# [2, 4, 6, 8, 10]

または、 stepを使用することもできます 方法:

(2..10).step(2).to_a
# [2, 4, 6, 8, 10]

Divmodメソッドの使用

モジュロ演算子のもう1つの用途は、分を時間+残りの分に変換することです。

90分あります。これは1時間30分と同じです。

hours, minutes = 90.divmod(60)
# [1, 30]

divmodに注意してください 方法:

除算とモジュロ(除算の残り)を同時に実行します。

とても役に立ちました!

数体系を理解する

記数法は、数を表す方法です。

毎日の数字の使用では、10進法を使用します 。

0123456789

記数法は、一連の数字と、場合によっては文字で構成されます。

16進法では、合計16個の記号が使用されます。

0123456789abcdef

これが一般的な記数法の表です :

名前 シンボルカウント 記号 オクタル バイナリ
16進数 16 0123456789abcdef
10進数 10 0123456789
8 01234567
2 01

to_s を使用して、Rubyの数値システム間で変換できます。 メソッド。

10進数から変換する方法は次のとおりです ( 9 )からバイナリ 1001 ):

9.to_s(2)
# "1001"

to_iを使用できます 文字列のメソッドを整数に変換し直します。

したがって、16進数から移動する場合 ( ff )から10進数 255 )これを行うことができます:

"ff".to_i(16)
# 255

ここで、16は「シンボルカウント」または数のベースです。

ビットマスキングとは何ですか?

おそらく毎日考えて目を覚ますことはないでしょう…

"おい! ブール値をたくさんパックする必要があります できるだけ小さなスペースに入れてください。」

しかし、いつかそれをする必要があるなら…

あなたを助けることができる素晴らしいテクニックは「ビットマスキング」です。

ビットマスキングを使用すると、多くのブール値を1つの整数値にパックできます。

どうしてそれが可能ですか?

個々のビットを使用する 番号が構成されていること。

ブール値は1ビットで表すことができ、整数値は64​​ビットであるため、最大64個のブール値を1つの数値にパックできます。

ビット演算子を使用します。

ここに表があります

名前 シンボル 使用 ビットの切り替え チェックビット クリアビット ビットを設定
XOR(排他的論理和) ^
そして
しない
または |

ビット単位の演算子はBITレベルで機能し、まさにそれが私たちの望みです。

コード例は次のとおりです

class Bitmask
  def initialize
    @value = 0
  end

  def set(bit)
    @value |= bit
  end

  def clear(bit)
    @value &= ~bit
  end

  def check(bit)
    (@value & bit) == bit
  end

  def to_binary
    @value.to_s(2)
  end
end

bit = Bitmask.new

BitMaskingの使用方法

これで、 setを使用できます 、 clear check このデータ構造を操作するメソッド。また、各値の意味を説明する定数を定義することもできます。

class Bitmask
  ENGINES_ENABLED = 1
  CAPTAIN_ABOARD  = 2
  SHIELDS_UP      = 4

  # ... rest of code here
end

bit = Bitmask.new

bit.set(Bitmask::ENGINES_ENABLED)
bit.check(Bitmask::ENGINES_ENABLED)

setの有効な値 1と2の累乗(2、4、8、16、32…)を含めると、他のビットの上書きを回避できます。

Rubyを使った数学:モジュロ演算子、バイナリなど

64 + 32 + 1の場合、保存される値は次のようになります。

1100001

ルビー数学メソッド

Rubyには、役立つ数学メソッドがいくつか組み込まれています。

divmodについてはすでに説明しました 、でも? odd?

その他の方法は次のとおりです

  • ** / pow (べき乗)
  • gcd (最大公約数)
  • abs (絶対値、負の符号を削除)
  • ラウンド (最も近い整数に丸めます)
  • フロア ceil (切り捨て/切り上げ)
  • Math.sqrt(n) (nの平方根)
  • Math.log2(n) (nのlog2)
  • (整数を数字の逆配列に変換します)

5 ** 2
# 25

-10.abs
# 10

300.digits
# [0, 0, 3]

Rubyビデオの数学

概要

モジュロを使用するなど、いくつかの興味深い数学のトリックを学びました。 除算の残りを見つけるために。余りを使用して、数値が別の数値で割り切れるかどうかを確認できます。

また、数値システム、ビットマスキング、ビット演算子についても学びました。

この投稿を共有することを忘れないでください…

まだ購読していない場合は、RubyGuidesニュースレターを購読してください!


  1. Rubyでパーサーを構築する方法

    構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ

  2. Ruby文字列のフォーマット

    Rubyで文字列をフォーマットする方法について話しましょう。 なぜ文字列をフォーマットしたいのですか?数値が10未満であっても、先行ゼロを使用したり(例:01、02、03…)、コンソール出力を列に適切にフォーマットしたりすることができます。 他の言語では、 printfを使用できます 文字列をフォーマットする関数です。Cを使用したことがある場合は、おそらくそのことに精通しているでしょう。 printfを使用するには フォーマット指定子のリストと変数または値のリストを定義する必要があります。 Ruby文字列フォーマット入門 sprintf はRubyでも利用できます。この投稿では、よ