From 0da34dbb26f3fc2770bd4e0c23ff99d00b4640b3 Mon Sep 17 00:00:00 2001 From: naruse Date: Tue, 12 Dec 2017 09:12:14 +0000 Subject: Integer#allbits?, Integer#anybits?, Integer#nobits? [Feature #12753] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61147 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- numeric.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'numeric.c') diff --git a/numeric.c b/numeric.c index dcf766e1c3..cd84956632 100644 --- a/numeric.c +++ b/numeric.c @@ -3165,6 +3165,45 @@ int_even_p(VALUE num) return Qfalse; } +/* + * call-seq: + * int.allbits?(mask) -> true or false + * + * Returns +true+ if all bits of +int+ & +mask+ is 1. + */ + +static VALUE +int_allbits_p(VALUE num, VALUE mask) +{ + return rb_int_equal(rb_int_and(num, mask), mask); +} + +/* + * call-seq: + * int.anybits?(mask) -> true or false + * + * Returns +true+ if any bits of +int+ & +mask+ is 1. + */ + +static VALUE +int_anybits_p(VALUE num, VALUE mask) +{ + return num_zero_p(rb_int_and(num, mask)) ? Qfalse : Qtrue; +} + +/* + * call-seq: + * int.nobits?(mask) -> true or false + * + * Returns +true+ if no bits of +int+ & +mask+ is 1. + */ + +static VALUE +int_nobits_p(VALUE num, VALUE mask) +{ + return num_zero_p(rb_int_and(num, mask)); +} + /* * Document-method: Integer#succ * Document-method: Integer#next @@ -5352,6 +5391,9 @@ Init_Numeric(void) rb_define_method(rb_cInteger, "integer?", int_int_p, 0); rb_define_method(rb_cInteger, "odd?", rb_int_odd_p, 0); rb_define_method(rb_cInteger, "even?", int_even_p, 0); + rb_define_method(rb_cInteger, "allbits?", int_allbits_p, 1); + rb_define_method(rb_cInteger, "anybits?", int_anybits_p, 1); + rb_define_method(rb_cInteger, "nobits?", int_nobits_p, 1); rb_define_method(rb_cInteger, "upto", int_upto, 1); rb_define_method(rb_cInteger, "downto", int_downto, 1); rb_define_method(rb_cInteger, "times", int_dotimes, 0); -- cgit v1.2.3