A common request I get for Console Calculator is support for a bitwise NOT operator (the ~ symbol in many programming languages).  The reason I have not yet implemented this is that CCalc has a very large intrinsic bit width (200+ bits).  A proper NOT operator cannot ignore leading zeros, so how many bits should I limit to?  Should ~0×80 be 0x7F or 0xFF7F or 0xFFFFFF7F, etc.

Anyway, you can define your own NOT function to the bit width you prefer.

not16(x)=0xFFFF-x
not32(x)=0xFFFFFFFF-x

Below are a few additional useful functions which I like to have around.

gain2db(gain)=20*log10(gain)
db2gain(db)=10^(db/20)
norm(x,y)=sqrt(x^2+y^2)
norm(x,y,z)=sqrt(x^2+y^2+z^2)
twoscomp16(x)=(0xFFFF+1+x)&0xFFFF
twoscomp32(x)=(0xFFFFFFFF+1+x)&0xFFFFFFFF
max(a,b)=a*(a>=b)+b*(b>a)
min(a,b)=a*(a<=b)+b*(b<a)

Do you have any useful custom functions you’ve defined?  Comment.



  1. Michael on Wednesday 30, 2009

    Heres a few small ones I use for handling timecodes on video/audio. They can probably be simplified further, but they do the trick.

    fps(x)=((x*1000)/1001)
    sec2min(x)=(floor(x/60)+((x%60)/100))
    min2sec(x)=(floor(x)*60)+((x-floor(x))*100)
    atm(x,y)=sec2min(min2sec(x)+min2sec(y))
    mtm(x,y)=sec2min(min2sec(x)-min2sec(y))
    tm2fr(x,y)=round(min2sec(x)*fps(y))
    fr2tm(x,y)=sec2min(x/fps(y))

    fps(x) -> converts frame rate to high precision floating point value, ie fps(24), ans = 23.976024

    sec2min -> converts seconds to minutes in format sec.microsec, ie 1463.558s to 24.23558 ( 24:23.558 )
    min2sec -> converts minutes to seconds in format min.sec+microsec, ie 24.23558 to 1463.558

    atm(x,y) -> adds 2 min.sec timecodes
    mtm(x,y) -> subtracts 2 min.sec timecodes

    tm2fr(min.sec,int fps) -> converts min.sec timecode to frame number at int fps framerate, ie the frame number at 24:23.558 with video frame rate of 23.976fps,

    > tm2fr(24.23558,24)
    ans = 35090

    So at that timecode and frame rate, the resultant frame will be 35090.

    fr2tm(int frame number, int fps) -> converts back from frame to min.sec timecode.

    > fr2tm(35090,24)
    ans = 24.2354542

    this will be with half a frame of the target timecode, quite hard to get this one perfect without checking the video yourself.

  2. Jake on Wednesday 30, 2009

    You could also define a variable-width not function:

    not(bits, x)=((2^bits – 1)-x)