| The Nuts and Bolts of the Java Language

## Operators

> The character-counting program uses several operators including `=`, `!=`, `++`, and `+` highlighted in this listing:

> >     class Count {
> >         public static void main(String[] args)
> >             throws java.io.IOException
> >         {
> >             int count = 0;

> >             while (System.in.read() != -1)
> >                 count++;
> >             System.out.println("Input has " + count + " chars.");
> >         }
> >     }

> Operators perform some function on either one or two operands. Operators that require one operand are called unary operators. For example, `++` is a unary operator that increments the value of its operand by one. Operators that require two operands are binary operators--the `=` operator is a binary operator that assigns the value from its right-hand operand to its left-hand operand.

> Java's unary operators can use either prefix or postfix notation. Prefix notation means that the operator appears before its operand:

> >     operator op

> Postfix notation means that the operator appears after its operand:

> >     op operator

> All of Java's binary operators use infix notation which means that the operator appears between its operands:

> >     op1 operator op2

> In addition to performing the operation, an operator also returns a value. The value and its type depends on the operator and the type of its operands. For example, the arithmetic operators (perform basic arithmetic operations such as addition and subtraction) return numbers--typically the result of the arithmetic operation. The data type returned by the arithmetic operators depends on the type of its operands: if you add two integers, you get an integer back. An operation is said to evaluate to its result.

> It's useful to divide Java's operators into these categories: arithmetic, relational and conditional, bitwise and logical, and assignment.

> #### Arithmetic Operators

> > The Java language supports various arithmetic operators--including `+` (addition), `-` (subtraction), `*` (multiplication), `/` (division), and `%` (modulo)--on all floating point and integer numbers. For example, you can use this Java code to add two numbers:

> > >     addThis + toThis

> > or this code to compute the remainder that results from dividing `divideThis` by `byThis`:

> > >     divideThis % byThis

> > This table summarizes Java's binary arithmetic operations:

> >     Operator    Use        Description
> >        +     op1 + op2     Adds op1 and op2
> >        -     op1 - op2     Subtracts op2 from op1
> >        *     op1 * op2     Multiplies op1 and op2
> >        /     op1 / op2     Divides op1 by op2
> >        %     op1 % op2     Computes the remainder of dividing op1 by op2

> > Note: The Java language extends the definition of the operator `+` to include string concatenation. The example program uses `+` to concatenate "`Input has` ", the value of `count`, and "`chars.`" Note that this operation automatically coerces the value `count` to a String.

> > >     System.out.println("Input has " + count + " chars.");

> > You'll see more about this in Arrays and Strings.

> > The `+` and `-` operators have unary versions which set the sign of the operand:

> >     Operator    Use        Description
> >        +       + op        Indicates a positive value
> >        -       - op        Arithmetically negates op

> > In addition, there are two short cut arithmetic operators, `++` which increments its operand by one, and `--` which decrements its operand by one. The character-counting example uses `++` to increment the `count` variable each time it reads a character from the input source:

> > >     count++;

> > Note that the `++` operator appears after its operand in this example. This is the postfix version of the operator. `++` also has a prefix version in which `++` appears before its operand. Both the prefix and postfix versions of this operator increment the operand by one. So why are there two different versions? Because each version evaluates a different value: `op++` evaluates to the value of the operand before the increment operation and `++op` evaluates the value of the operand after the increment operation.

> > In the character-counting program suppose that count is say, 5, before this statement is executed:

> > >     count++;

> > After the statement is executed the value of `count` is 6. No surprises there. However, the statement `count++` evaluates to 5. In the same scenario the prefix version of `++`:

> > >     ++count;

> > also sets `count` to 6, however the statement `++count` does not evaluate to 5 like the postfix version of `++`, but 6. This difference is unimportant in the character-counting program but is critical in situations where the value of the statement is used for a computation, for flow control, or for something else. For example, the following loop will execute one less time if you change `count++` to `++count`:

> > >     do {
> > >         . . .
> > >     } while (count++ < 6);

> > You'll learn more about flow control in Control Flow Statements.

> > Similarly, `--` also has prefix and postfix versions which function in the same way as `++`.

> >     Operator    Use        Description
> >        ++      op ++       Increments op by 1; evaluates to value before incrementing
> >        ++      ++ op       Increments op by 1; evaluates to value after incrementing
> >        --      op --       Decrements op by 1; evaluates to value before decrementing
> >        --      -- op       Decrements op by 1; evaluates to value after decrementing

> #### Relational and Conditional Operators

> > Relational operators compare two values and determine the relationship between them. For example, `!=` returns `true` if the two operands are unequal. The character-counting program uses `!=` to determine whether the value returned by `System.in.read()` is not equal to -1.

> > This table summarizes Java's relational operators:

> >     Operator     Use          Returns true if
> >        >      op1 > op2       op1 is greater than op2
> >        >=     op1 >= op2      op1 is greater than or equal to op2
> >        <      op1 < op2       op1 is less than to op2
> >        <=     op1 <= op2      op1 is less than or equal to op2
> >        ==     op1 == op2      op1 and op2 are equal
> >        !=     op1 != op2      op1 and op2 are not equal

> > Often the relational operators are used with another set of operators, the conditional operators, to construct more complex decision making expressions. One such operator is `&&` which performs the boolean and operation. For example, you can use two different relational operators along with `&&` to determine if both relationships are true. The following line of code uses this technique to determine if an array index is between two boundaries--that is, to determine if the index is both greater than 0 and less than `NUM_ENTRIES` (which is a previously defined constant value):

> > >     0 < index && index < NUM_ENTRIES

> > Note that in some instances, the second operand to a conditional operator may not be evaluated. Consider this statement:

> > >     ((count > NUM_ENTRIES) && (System.in.read() != -1))

> > If `count` is less than `NUM_ENTRIES`, the left-hand operand for `&&` evaluates to false. The `&&` operator will return true only if both operands are true. So in this situation, the return value of `&&` can be determined without evaluating the right-hand operand. In a case such as this, Java will not evaluate the right-hand operand. Thus, System.in.read() won't get called and a character will not be read from standard input.

> > There are three conditional operators:

> >     Operator     Use          Returns true if
> >        &&      op1 && op2     op1 and op2 are both true
> >        ||      op1 || op2     either op1 or op2 is true
> >        !       ! op           op is false

> > The operator `&` can be used as a synonym for `&&` if boths of its operands are boolean. Similarly, `|` is a synonym for `||` if both of its operands are boolean.

> #### Bitwise Operators

> > The bitwise operators allow you to perform bit manipulation on data. This table summarizes the bitwise and logical operators available in the Java language.

> >     Operator     Use          Operation
> >        >>     op1 >> op2      shift bits of op1 right by distance op2
> >        <<     op1 << op2      shift bits of op1 left by distance op2
> >        >>>    op1 >>> op2     shift bits of op1 right by distance op2 (unsigned)
> >        &      op1 & op2       bitwise and
> >        |      op1 | op2       bitwise or
> >        ^      op1 ^ op2       bitwise xor
> >        ~      ~ op            bitwise complement

> > The three shift operators simply shift the bits of the left-hand operand over by the number of positions indicated by the right-hand operand. The shift occurs in the direction indicated by the operator itself. For example:

> > >     13 >> 1;

> > shifts the bits of the integer 13 to the right by one position. The binary representation of the number 13 is 1101. The result of the shift operation is 1101 shifted to the right by one position--110 or 6 in decimal. Note that the bit farthest to the right falls off the end into the bit bucket. A right shift of one bit is equivalent to, but more efficient than, dividing the left-hand operand by two. A left shift of one bit is equivalent to multiplying by two.

> > The bitwise and operation performs the "and" function on each parallel pair of bits in each operand. The "and" function sets the resulting bit to one if both operands are 1.

> >     op1    op2   result
> >      0      0      0
> >      0      1      0
> >      1      0      0
> >      1      1      1

> > Suppose you were to "and" the values 12 and 13:

> > >     12 & 13

> > The result of this operation is 12. Why? Well, the binary representation of 12 is 1100, and the binary representation of 13 is 1101. The "and" function sets the resulting bit to one if both operand bits are 1, otherwise, the resulting bit is 0. So, if you line up the two operands and perform the "and" function, you can see that the two high-order bits (the two bits farthest to the left of each number) of each operand is 1 thus the resulting bit in the result is also 1. The low-order bits evaluate to 0 because either one or both bits in the operands are 0:

> > >         1101
> > >       & 1100
> > >       ------
> > >         1100

> > The `|` operator performs the inclusive or operation and `^` performs the exclusive or operation. Inclusive or means that if either of the two bits are 1 then the result is one.

> >     op1    op2   result
> >      0      0      0
> >      0      1      1
> >      1      0      1
> >      1      1      1

> > Exclusive or means that if the two operand bits are different the result is one, otherwise the result is 0.

> >     op1    op2   result
> >      0      0      0
> >      0      1      1
> >      1      0      1
> >      1      1      0

> > And finally, the complement operator inverts the value of each bit of the operand: if the operand bit is 1 the result is 0 and if the operand bit is 0 the result is 1.

> > Among other things, bitwise manipulations are useful for managing sets of boolean flags. Suppose for example, that you had several boolean flags in your program that indicated the state of various components in your program: is it visible, is it draggable, and so on. Rather than define a separate boolean variable to hold each flag, you could define a single variable, `flags`, for all of them. Each bit within `flags` would represent the current state of one of the flags. You would then use bit manipulations to set and get each flag.

> > First, you would set up constants that indicated the various flags for your program. These flags should each be a different power of two to ensure that the "on" bit didn't overlap with another flag. You would also define a variable, `flags`, whose bits would be set according to the current state of each flag. This code sample initializes `flags` to 0 which means that all flags are false (none of the bits are set).

> > >     final int VISIBLE = 1;
> > >     final int DRAGGABLE = 2;
> > >     final int SELECTABLE = 4;
> > >     final int EDITABLE = 8;

> > >     int flags = 0;

> > To set the "visible" flag when something became visible you would use this statement:

> > >     flags = flags ^ VISIBLE;

> > To test for visibility, you could then write:

> > >     flags & VISIBLE

> #### Assignment Operators

> > You use the assignment operator, `=`, to assign one value to another. The character-counting program uses `=` to initialize `count` with this statement:

> > >     int count = 0;

> > In addition to the basic assignment operator, Java provides several short cut assignment operators that allow you to perform an arithmetic, logical, or bitwise operation and an assignment operation all with one operator. Specifically, suppose you wanted to add a number to a variable and assign the result back into the variable, like this:

> > >     i = i + 2;

> > You can shorten this statement using the short cut operator `+=`.

> > >     i += 2;

> > The two previous lines of code are equivalent.

> > This table lists the short cut assignment operators and their lengthy equivalents:

> >     Operator     Use          Equivalent to
> >        +=      op1 += op2     op1 = op1 + op2
> >        -=      op1 -= op2     op1 = op1 - op2
> >        *=      op1 *= op2     op1 = op1 * op2
> >        /=      op1 /= op2     op1 = op1 / op2
> >        %=      op1 %= op2     op1 = op1 % op2

> >        &=      op1 &= op2     op1 = op1 & op2
> >        |=      op1 |= op2     op1 = op1 | op2
> >        ^=      op1 ^= op2     op1 = op1 ^ op2
> >        <<=     op1 <<= op2    op1 = op1 << op2
> >        >>=     op1 >>= op2    op1 = op1 >> op2
> >        >>>=    op1 >>>= op2   op1 = op1 >>> op2

| The Nuts and Bolts of the Java Language