Re: ones and twos compliment
[email protected] (Bruce Gray) Fri, 6 Jun 2025 23:28:42 -0500
| Newsgroups | perl.perl6.users |
|---|---|
| Message-ID | <[email protected]> |
> On Jun 6, 2025, at 21:53, ToddAndMargo via perl6-users <[email protected]> wrote: > > Hi All, > > Is there an easy way to print ones' and two's compliment > of a 32 bit integer? > > Many thanks, > -T > > > sub ones-complement(Int $num) { > my $binary = $num.base(2); > my $complement = ''; > for $binary.comb -> $bit { > $complement ~= $bit eq '0' ?? '1' !! '0'; > } > return $complement; > } > > my $number = 5; > my $complement = ones-complement($number); > print "Ones complement of $number is $complement\n"; > > > seems a bit much: > https://search.brave.com/search?q=raku+print+ones+compliment&source=web&summary=1&conversation=00fda578d0badafdf15143 Seems wrong, too. 1. The code in `sub ones-complement`: A. ends in `return $complement`, but should probably end in `return $complement.parse-base(2)`. B. could be shortened to `$num.base(2).trans(<0 1>=><1 0>).parse-base(2)`. C. Gives the same result of `2` (or binary "010") for inputs of 5,13,29,61..., which means it is not invertable, so it is probably not the droids^Wcode you are looking for. D. Might be saved by changing it to `(('0' x 32) ~ $num.base(2)).substr(*-32).trans(<0 1> => <1 0>).parse-base(2)`, but there is no need, because: 2. Raku has twos-complement built-in, via prefix `+^`. (Not *infix* `+^`, which would be numeric `xor`). A. So: `sub twos-complement (Int $num) { return +^ $num }` B. `sub ones-complement (Int $num) { return 1 + twos-complement($num) }` # Or would it be `-1` when negative? Depends on if you are doing `int` or `uint`? Unsure right now. See also: https://docs.raku.org/language/operators#prefix_+^ https://rosettacode.org/wiki/Bitwise_operations#Raku https://raku.land/zef:thundergnat/FixedInt -- Hope this helps (but I am very sick with a 72-hour bug, so I may have missed something important), Bruce Gray (Util of PerlMonks)