How to get the negate of decimal to binary?

Hi All,
New to this forum (and yes , a newbie in programming..:p)

I have a decimal to binary converter script done this way :

i=$1

bit0=$(( (i & 0x01) > 0 ))
bit1=$(( (i & 0x02) > 0 ))
bit2=$(( (i & 0x04) > 0 ))
bit3=$(( (i & 0x08) > 0 ))
bit4=$(( (i & 0x10) > 0 ))
bit5=$(( (i & 0x20) > 0 ))
bit6=$(( (i & 0x40) > 0 ))
bit7=$(( (i & 0x80) > 0 ))

Fisrt I would like to understand how the expression $(( (i & 0x01) > 0 )) works

Next, I need to obtain the same bits to its negate, so i.e. if for decimal 177

bit0=1
bit1=0
bit2=0
bit3=0
bit4=1
bit5=1
bit6=0
bit7=1

I need

bit8=0
bit9=1
bitA=1
bitB=1
bitC=0
bitD=0
bitE=1
bitF=0

is there a way to accomplish this inside the same script ??

Thank you very much.

Are you sure it is a negate or an INVERT?

What you are showing looks like an INVERT...

So just subtract 177 from 255 and voila you have your decimal 78...

BTW is this homework?

hmmmmm????

I never seen the thing under this aspect...

Effectively, let's take 98 :

01100010

do 255-98=157 that is

10011101

comparing the two:

01100010
10011101

Exactly the opposite cosidering bit to bit !!!!! :slight_smile:

So I should keep the first part of the script to obtain the first conversion and add a second part to do 255-inputvalue and then again another conversion

like:

i=$1
n=(255-i)

bit0=$(( (i & 0x01) > 0 ))
bit1=$(( (i & 0x02) > 0 ))
bit2=$(( (i & 0x04) > 0 ))
bit3=$(( (i & 0x08) > 0 ))
bit4=$(( (i & 0x10) > 0 ))
bit5=$(( (i & 0x20) > 0 ))
bit6=$(( (i & 0x40) > 0 ))
bit7=$(( (i & 0x80) > 0 ))

bit8=$(( (n & 0x01) > 0 ))
bit9=$(( (n & 0x02) > 0 ))
bitA=$(( (n & 0x04) > 0 ))
bitB=$(( (n & 0x08) > 0 ))
bitC=$(( (n & 0x10) > 0 ))
bitD=$(( (n & 0x20) > 0 ))
bitE=$(( (n & 0x40) > 0 ))
bitF=$(( (n & 0x80) > 0 ))

??????

Is there perhaps a quicker negation of already producted single bit0-bit7 bits ??

I need it for a little project in BeagleBone GPIO, not quite homework...(homework should be done many years ago....when I was younger with less woody brain...:o )

Thank you

Hi...

REMEBER! What I have shown you is for 8 bits...
IF you require 16 bits the subtract your number from 65535...
(Similarly for 32 bits, etc...)

Look at your problem logically...

"$1" is the first user argument of your shell script and it looks as though you will be entering your script as something like this:-

Your prompt> somescript 10101010<CR>

<CR> == carraiage return...

You have saved this argument inside your variable "i"

So "i" now contains a _string_ representation of your binary value...

Use something like:-

${i:position_in_string:1}

To change each bit...

This method keeps it all inside bash builtins...

I am at work ATM so replies will be sporadic from me so have a go yourself... ;o)

The argument passed to script is a decimal number
Anyway the method you suggested me (255-i then reconversion) works 100%
Just tested on real circuit.

So i'll go that way

Thank you very much again

Might I suggest using what is already available?

$ i=98
$ typeset -Z8 n=`echo "ibase=10;obase=2;255-$i"|bc`
$ echo $n
10011101
$ 

I hope that this is useful. I got the basis of this elsewhere on the board so I thought I should share it.

Robin
Liverpool/Blackburn
UK

!!! very good as well.. !!!!

Thank you very much