472,108 Members | 1,963 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,108 software developers and data experts.

All Arithmatic operations using Bitwise operators only

Is it possible to perform all arithmetic operations (+,-,*,/) using Bitwise operations only. Please consider signed numbers also.
Thank You.
Dec 25 '08 #1
14 18975
9,208 Expert Mod 8TB
Of course. That's how the processor does it.
Dec 25 '08 #2

Yes, I have a method for addition and subtraction given below

Expand|Select|Wrap|Line Numbers
  1. int add(int a, int b)
  2.            do
  3.            {
  4.                       a=a^b;
  5.                       b=(a^b)&b;
  6.                       b=b<<1;
  7.            } while(b);
  9.            return(a);
  10. }
Basically using this method, one can perform Multiplication and Division operations.
Now, is there any other specialized methods for Multiplication and Division operations? e.g. (num<<1) is like (num*2) and (num>>2) is same as (num/2).
Here we are not using the addition or subtraction operations, but directly obtaining results of Multiplication and Division operations. Please explain any such method.
Please give example of processors methods of these operations(+,-,*,/).
Thank You.
Dec 25 '08 #3
9,208 Expert Mod 8TB
I don't see a question in your reply. In any case, I cannot provide solutions, act as a tutor or do research for you.

Please read the posting guidelines.
Dec 26 '08 #4
344 100+
Hi Aftabpasha,

It is true that you can perform all arithmetic operations using the two basics operations + and -.
I have studied Z80 Microprocessor by mad by Zilog, it offers only ADD, SUB, INC (increment), and DEC (decrement) arithmetical operations (beside Logic operations), we typed programs in assembly to make Multiplication and Division, and what amazing is that it still produced and successes until now in many new and complicated applications.

the next Microprocessor generation 8086 provides MUL and DIV operations, and an improvement in H/W (Hardware) like increasing the addressing capacity, data bus 16 bit and pipelining etc.

But nowadays CPUs with high Memory capacity and provide very complex operations like Log, antiLog, tan, cos, .... and that is what you use in home and me and everyone else.
Dec 27 '08 #5
344 100+
Here is Example

Multiplication of two numbers
int MULT(int x, int y)
int n = x;
while (n) {
x += y;
return y;

Division of two numbers
int DIV(int x, int y)
int n = 0;
while (x > y) {
x -= y;
return n; // truncate fraction
Dec 27 '08 #6
2,425 Expert 2GB
Is this assignment for a programming class or a Boolean algebra course? You should start with addition: google the term "half adder". You can add two binary numbers by stringing together enough half adders. Once you have addition working it is simple to get subtraction: google the term "two's complement". Multiplication is repeated addition; division is repeated subtraction.
Dec 27 '08 #7
344 100+
I worked on a personal Microprocessor Simulator last year, where i used basic logic gates (AND, OR, XOR) to perform all mathematical operations provided by the MP using Boolean to represent data in registers.

Introduce a big piece of code may confuse or tiered, so i expected these methods to declare the way of thinking, not to explain the whole idea.

Dec 27 '08 #8
11,448 Expert 8TB
Don't do it that way; it takes ages to complete; the Russian Peasant Method is more clever:

Expand|Select|Wrap|Line Numbers
  1. int mul(int x, int y) {
  2.    int p;
  3.    for (p= 0; x; x>>= 1, y<<= 1)
  4.       if (x&1) p+= y;
  5.    return p;
  6. }
kind regards,

Dec 28 '08 #9
9,065 Expert Mod 8TB
Bassem, your multiplication algorithm is wrong you return y which is unchanged by the function.

Everyone, you are left shifting a signed value. For C (and I assume C++ but I don't actually know) this is a platform defined operation, that is different platforms may implement it differently producing different results (normally depending of whether the platform performs an arithmetic or logical shift).

For portability it is only safe to shift unsigned values.
Dec 28 '08 #10
11,448 Expert 8TB
You still must have eggnog in your brains ;-) A left shift is a logical shift to the left; a right shift shifts in the sign bit (by definition) if an artithmetic shift is used with a signed int, otherwise a zero bit is shifted in (a logical shift). But you're right: an unsigned shift has always been more 'natural' to me as well ;-)

kind regards,

Dec 28 '08 #11
Thank you all for your replies. So, from these posts, I think, one can say that there can be different methods for performing the basic arithmetic operations using bit-wise operators on different machines, and therefore it is necessary to know how certain basic bit-wise operations are performed on different platforms before using them in coding. Otherwise it is better to use normal arithmetic operators (+,-,*,/), specially when you want platform-independent code.
Thank you all once again.
Kind Regards.
Dec 30 '08 #12
2,425 Expert 2GB
It is _always_ better to use normal arithmetic operators to perform arithmetic functions. The exceptions to this simple rule are so exceptional that you're unlikely to ever run into them.
Dec 30 '08 #13
344 100+
Thanks a lot Banfa,
I ment to return x not y.

As you said the platform who provides the operations, we just use.

Josah, your idea is clear using Half-Adder or Full-Adder, and that leads me to ask why Bytes.com have no community for Microprocessors / Microcontrollers ?

It may be replaced to suggestions (Dept.) - if it's correct to say- Thanks anyway,
I get widely help from your (all of you) answers for many questions other put.

Regards for all,
Dec 30 '08 #14
Thank you all. Donbock, I'll remember your advice.

Dec 31 '08 #15

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

4 posts views Thread by Jason | last post: by
4 posts views Thread by Mike Hodkin | last post: by
14 posts views Thread by Tony Johansson | last post: by
9 posts views Thread by Christopher Weaver | last post: by
4 posts views Thread by AMDRIT | last post: by
5 posts views Thread by noridotjabi | last post: by
16 posts views Thread by Shawnk | last post: by
8 posts views Thread by Daniel Gutson | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.