8
$\begingroup$

Can anyone explain why the last result in these statements is not the bit-flipped version of arr?

(Debug) In[189]:= arr = {0, 0, 1, 0, 0, 0, 1, 0}

(Debug) Out[189]= {0, 0, 1, 0, 0, 0, 1, 0}

(Debug) In[190]:= FromDigits[%, 2]

(Debug) Out[190]= 34

(Debug) In[191]:= BitNot[%]

(Debug) Out[191]= -35

(Debug) In[192]:= IntegerDigits[%, 2, 8]

(Debug) Out[192]= {0, 0, 1, 0, 0, 0, 1, 1}
$\endgroup$
10
  • 5
    $\begingroup$ "IntegerDigits[n] discards the sign of n." $\endgroup$
    – kglr
    Commented Mar 12, 2019 at 21:37
  • $\begingroup$ Is there a work around? $\endgroup$
    – bc888
    Commented Mar 12, 2019 at 21:43
  • $\begingroup$ not any I know of. $\endgroup$
    – kglr
    Commented Mar 12, 2019 at 21:44
  • 10
    $\begingroup$ Integers can have arbitrary length, so how many leading zeros should be flipped? The documentation clarifies: "Integers are assumed to be represented in two's complement form, with an unlimited number of digits, so that BitNot[n] is simply equivalent to -1-n." $\endgroup$
    – Greg Hurst
    Commented Mar 12, 2019 at 22:00
  • 2
    $\begingroup$ If you just want to flip "bits" in an array of 1/0 elements without the need to go between integer representation, just use BitXor[1,array]... $\endgroup$
    – ciao
    Commented Mar 14, 2019 at 6:34

4 Answers 4

10
$\begingroup$

I don't think there is a built-in function to generate the two's complement representation. Easy to implement though.

twosComplement[x_, n_] := IntegerDigits[2^x - n, 2, n]
twosComplement[35, 8]
(* {1, 1, 0, 1, 1, 1, 0, 1} *)
$\endgroup$
11
$\begingroup$
twosComplement[x_, n_] := UnitBox@IntegerDigits[x, 2, n]
twosComplement[35, 8]

{1, 1, 0, 1, 1, 1, 0, 1}

$\endgroup$
7
$\begingroup$

Without using IntegerDigits[]:

With[{n = 34}, 
     {n, BitXor[BitShiftLeft[1, BitLength[n]] - 1, n]} // BaseForm[#, 2] &]
   {100010₂, 11101₂}

With[{n = 34, p = 8},
     {n, BitXor[BitShiftLeft[1, p] - 1, n]} // BaseForm[#, 2] &]
   {100010₂, 11011101₂}
$\endgroup$
4
$\begingroup$
FlipBits[num_Integer, len_.] := 
 Module[{arr}, arr = IntegerDigits[num, 2, len];
  1 - arr]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.