170 bool arg0_is_int = bitop_arg_is_int (args(0));
171 bool arg1_is_int = bitop_arg_is_int (args(1));
173 bool arg0_is_bool = bitop_arg_is_bool (args(0));
174 bool arg1_is_bool = bitop_arg_is_bool (args(1));
176 bool arg0_is_float = bitop_arg_is_float (args(0));
177 bool arg1_is_float = bitop_arg_is_float (args(1));
179 if (! (arg0_is_int || arg1_is_int))
181 if (arg0_is_bool && arg1_is_bool)
188 else if (arg0_is_float && arg1_is_float)
195 else if (! (arg0_is_float || arg1_is_float))
204 int p = (arg0_is_float ? 1 : 0);
205 int q = (arg0_is_float ? 0 : 1);
215 int p = (arg0_is_int ? 1 : 0);
216 int q = (arg0_is_int ? 0 : 1);
228 else if (args(q).type_id () == octave_uint32_matrix::static_type_id ()
229 || args(q).type_id () == octave_uint32_scalar::static_type_id ())
236 else if (args(q).type_id () == octave_uint16_matrix::static_type_id ()
237 || args(q).type_id () == octave_uint16_scalar::static_type_id ())
244 else if (args(q).type_id () == octave_uint8_matrix::static_type_id ()
245 || args(q).type_id () == octave_uint8_scalar::static_type_id ())
252 else if (args(q).type_id () == octave_int64_matrix::static_type_id ()
253 || args(q).type_id () == octave_int64_scalar::static_type_id ())
260 else if (args(q).type_id () == octave_int32_matrix::static_type_id ()
261 || args(q).type_id () == octave_int32_scalar::static_type_id ())
268 else if (args(q).type_id () == octave_int16_matrix::static_type_id ()
269 || args(q).type_id () == octave_int16_scalar::static_type_id ())
276 else if (args(q).type_id () == octave_int8_matrix::static_type_id ()
277 || args(q).type_id () == octave_int8_scalar::static_type_id ())
285 error (
"%s: invalid operand type", fname.c_str ());
288 else if (args(0).class_name () == args(1).class_name ())
298 else if (args(0).type_id () == octave_uint32_matrix::static_type_id ()
299 || args(0).type_id () == octave_uint32_scalar::static_type_id ())
306 else if (args(0).type_id () == octave_uint16_matrix::static_type_id ()
307 || args(0).type_id () == octave_uint16_scalar::static_type_id ())
314 else if (args(0).type_id () == octave_uint8_matrix::static_type_id ()
315 || args(0).type_id () == octave_uint8_scalar::static_type_id ())
322 else if (args(0).type_id () == octave_int64_matrix::static_type_id ()
323 || args(0).type_id () == octave_int64_scalar::static_type_id ())
330 else if (args(0).type_id () == octave_int32_matrix::static_type_id ()
331 || args(0).type_id () == octave_int32_scalar::static_type_id ())
338 else if (args(0).type_id () == octave_int16_matrix::static_type_id ()
339 || args(0).type_id () == octave_int16_scalar::static_type_id ())
346 else if (args(0).type_id () == octave_int8_matrix::static_type_id ()
347 || args(0).type_id () == octave_int8_scalar::static_type_id ())
355 error (
"%s: invalid operand type", fname.c_str ());
358 error (
"%s: must have matching operand types", fname.c_str ());
570 int nargin = args.length ();
572 if (nargin < 2 || nargin > 3)
575 NDArray n = args(1).xarray_value (
"bitshift: K must be a scalar or array of integers");
583 if (args(2).
numel () > 1)
584 error (
"bitshift: N must be a scalar integer");
586 nbits = args(2).strict_int_value (
"bitshift: N must be an integer");
589 error (
"bitshift: N must be positive");
597 if (cname ==
"double")
599 static const int bits_in_mantissa
600 = std::numeric_limits<double>::digits;
602 nbits = (nbits < bits_in_mantissa ? nbits : bits_in_mantissa);
603 int64_t mask = max_mantissa_value<double> ();
604 if (nbits < bits_in_mantissa)
605 mask = mask >> (bits_in_mantissa - nbits);
606 int bits_in_type =
sizeof (
double)
607 * std::numeric_limits<unsigned char>::digits;
611 else if (cname ==
"uint8")
613 else if (cname ==
"uint16")
615 else if (cname ==
"uint32")
617 else if (cname ==
"uint64")
619 else if (cname ==
"int8")
621 else if (cname ==
"int16")
623 else if (cname ==
"int32")
625 else if (cname ==
"int64")
627 else if (cname ==
"single")
629 static const int bits_in_mantissa
630 = std::numeric_limits<float>::digits;
631 nbits = (nbits < bits_in_mantissa ? nbits : bits_in_mantissa);
632 int64_t mask = max_mantissa_value<float> ();
633 if (nbits < bits_in_mantissa)
634 mask = mask >> (bits_in_mantissa - nbits);
635 int bits_in_type =
sizeof (
float)
636 * std::numeric_limits<unsigned char>::digits;
641 error (
"bitshift: not defined for %s objects", cname.c_str ());