Difference between revisions of "Or"
(Undo revision 140645 by Rfc1394 (talk): do not the use Template: HL) Tag: Undo |
(replace legacy syntaxhighlight syntax, remove explicit category Category: Pascal already done via {{or}}, add category Code since page contains a code snippet in section →setting a bit: , improve typography) |
||
Line 1: | Line 1: | ||
{{Or}} | {{Or}} | ||
− | The [[Reserved word|reserved word]] <syntaxhighlight lang="pascal" | + | The [[Reserved word|reserved word]] <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> is a binary [[Operator|operator]]. |
Originally it stood for the logical disjunction of two [[Boolean|boolean values]] only, but with the advent of [[Operator overloading|operator overloading]] [[FPC]] allows everything else, too. | Originally it stood for the logical disjunction of two [[Boolean|boolean values]] only, but with the advent of [[Operator overloading|operator overloading]] [[FPC]] allows everything else, too. | ||
− | FPC also defines the <syntaxhighlight lang="pascal" | + | FPC also defines the <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> operator accepting two ordinal types while performing calculations on their internal binary representation. |
== boolean operation == | == boolean operation == | ||
− | The expression <syntaxhighlight lang="pascal" | + | The expression <syntaxhighlight lang="pascal" inline>A or B</syntaxhighlight> represents the term <math>A \lor B</math> as it is familiar from classical logic. |
In electrical engineering writing <math>A + B</math> is common, too, but in programming the meaning of the plus sign differs. | In electrical engineering writing <math>A + B</math> is common, too, but in programming the meaning of the plus sign differs. | ||
− | <syntaxhighlight lang="pascal" | + | <syntaxhighlight lang="pascal" inline>A</syntaxhighlight> and <syntaxhighlight lang="pascal" inline>B</syntaxhighlight> are both boolean values. |
− | The expression evaluates to either [[false and true|<syntaxhighlight lang="pascal" | + | The expression evaluates to either [[false and true|<syntaxhighlight lang="pascal" inline>true</syntaxhighlight> or <syntaxhighlight lang="pascal" inline>false</syntaxhighlight>]]. |
− | It is only <syntaxhighlight lang="pascal" | + | It is only <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> if both operands are <syntaxhighlight lang="pascal" inline>false</syntaxhighlight>: |
{| class="wikitable" style="text-align:center; margin:auto;" | {| class="wikitable" style="text-align:center; margin:auto;" | ||
− | ! <syntaxhighlight lang="pascal" | + | ! <syntaxhighlight lang="pascal" inline>A</syntaxhighlight> |
− | ! <syntaxhighlight lang="pascal" | + | ! <syntaxhighlight lang="pascal" inline>B</syntaxhighlight> |
− | ! <syntaxhighlight lang="pascal" | + | ! <syntaxhighlight lang="pascal" inline>A or B</syntaxhighlight> |
|- | |- | ||
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> |
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> |
− | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" | + | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> |
|- | |- | ||
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> |
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
− | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" | + | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
|- | |- | ||
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>false</syntaxhighlight> |
− | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" | + | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
|- | |- | ||
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
− | | <syntaxhighlight lang="pascal" | + | | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
− | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" | + | | style="background: #eeeeee" | <syntaxhighlight lang="pascal" inline>true</syntaxhighlight> |
|+ truth table for logical disjunction | |+ truth table for logical disjunction | ||
|} | |} | ||
== bitwise operation == | == bitwise operation == | ||
− | Since virtually all instruction sets have an <syntaxhighlight lang="asm" | + | Since virtually all instruction sets have an <syntaxhighlight lang="asm" inline>or</syntaxhighlight> instruction, it is no surprise some high-level languages, especially those which aim to be suitable for hardware programming, provide some comparable functionality by itself. |
− | In FPC the <syntaxhighlight lang="pascal" | + | In FPC the <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> operator is defined appropriately. |
Such an expression, also known as bitwise or, requires two ordinal operands. | Such an expression, also known as bitwise or, requires two ordinal operands. | ||
The operation virtually performs a logical or taking each corresponding bit from both operands. | The operation virtually performs a logical or taking each corresponding bit from both operands. | ||
Line 44: | Line 44: | ||
―――――――――――― | ―――――――――――― | ||
0101'1011 | 0101'1011 | ||
− | <!-- | + | <!-- You’re welcome to insert a different example where flags are or’ed together instead --> |
− | For a typical usage example of <syntaxhighlight lang="pascal" | + | For a typical usage example of <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> confer [[&#octal base|<syntaxhighlight lang="pascal" inline>program messageNo</syntaxhighlight>]]’s passing remark. |
=== setting a bit === | === setting a bit === | ||
A common task is to set a specific bit. | A common task is to set a specific bit. | ||
− | To achieve this utilizing the <syntaxhighlight lang="pascal" | + | To achieve this utilizing the <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> operator elicits a smart implementation: |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
type | type | ||
Line 62: | Line 62: | ||
{$pop} | {$pop} | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | For example calling <syntaxhighlight lang="delphi" | + | For example calling <syntaxhighlight lang="delphi" inline>maskOn(%1000, 1)</syntaxhighlight> will result in <syntaxhighlight lang="delphi" inline>%1010</syntaxhighlight> (<syntaxhighlight lang="delphi" inline>%1000</syntaxhighlight> equals decimal eight, and <syntaxhighlight lang="delphi" inline>%1010</syntaxhighlight> is ten). |
=== comparative remarks === | === comparative remarks === | ||
Line 70: | Line 70: | ||
Take it under advisement whether your programming task can be modeled with sets even better. | Take it under advisement whether your programming task can be modeled with sets even better. | ||
− | When using sets a [[Plus|plus sign <syntaxhighlight lang="pascal" | + | When using sets a [[Plus|plus sign <syntaxhighlight lang="pascal" inline>+</syntaxhighlight>]] virtually does the same as the bitwise <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> does (depends on the compiler’s implementation of the data type <syntaxhighlight lang="pascal" inline>set</syntaxhighlight>). |
This notation is, as already mentioned above, familiar from electrical engineering. | This notation is, as already mentioned above, familiar from electrical engineering. | ||
− | However, when handling sets the bitwise <syntaxhighlight lang="pascal" | + | However, when handling sets the bitwise <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> is called a ''union'' (of sets). |
== see also == | == see also == | ||
− | * [https://www.freepascal.org/docs-html/ref/ | + | * [https://www.freepascal.org/docs-html/ref/refsu46.html § “boolean operators” in the “Free Pascal Reference Guide”] regarding the logical disjunction |
− | * [https://www.freepascal.org/docs-html/ref/ | + | * [https://www.freepascal.org/docs-html/ref/refsu45.html § “logical operators” in the “Free Pascal Reference Guide”] regarding the bitwise <syntaxhighlight lang="pascal" inline>or</syntaxhighlight> |
− | * [[And|<syntaxhighlight lang="pascal" | + | * [[And|<syntaxhighlight lang="pascal" inline>and</syntaxhighlight>]] |
− | * [[Xor|<syntaxhighlight lang="pascal" | + | * [[Xor|<syntaxhighlight lang="pascal" inline>xor</syntaxhighlight>]] |
− | * {{Doc|package=RTL|unit=system|identifier=.op-logicalor-variant-ariant-ariant|text=<syntaxhighlight lang="pascal" | + | * {{Doc|package=RTL|unit=system|identifier=.op-logicalor-variant-ariant-ariant|text=<syntaxhighlight lang="pascal" inline>system.logicalor</syntaxhighlight>}} |
− | [[Category: | + | [[Category:Code]] |
Latest revision as of 17:27, 21 February 2022
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
The reserved word or
is a binary operator.
Originally it stood for the logical disjunction of two boolean values only, but with the advent of operator overloading FPC allows everything else, too.
FPC also defines the or
operator accepting two ordinal types while performing calculations on their internal binary representation.
boolean operation
The expression A or B
represents the term [math]\displaystyle{ A \lor B }[/math] as it is familiar from classical logic.
In electrical engineering writing [math]\displaystyle{ A + B }[/math] is common, too, but in programming the meaning of the plus sign differs.
A
and B
are both boolean values.
The expression evaluates to either true
or false
.
It is only false
if both operands are false
:
A
|
B
|
A or B
|
---|---|---|
false
|
false
|
false
|
false
|
true
|
true
|
true
|
false
|
true
|
true
|
true
|
true
|
bitwise operation
Since virtually all instruction sets have an or
instruction, it is no surprise some high-level languages, especially those which aim to be suitable for hardware programming, provide some comparable functionality by itself.
In FPC the or
operator is defined appropriately.
Such an expression, also known as bitwise or, requires two ordinal operands.
The operation virtually performs a logical or taking each corresponding bit from both operands.
0101'1010 or 0000'1011 ―――――――――――― 0101'1011
For a typical usage example of or
confer program messageNo
’s passing remark.
setting a bit
A common task is to set a specific bit.
To achieve this utilizing the or
operator elicits a smart implementation:
type
integerBitIndex = 0..bitSizeOf(integer)-1;
{$push}
{$rangeChecks on} // instead of raising an exception, generate an RTE
function maskOn(const x: integer; const i: integerBitIndex): integer;
begin
maskOn := x or (%1 shl i);
end;
{$pop}
For example calling maskOn(%1000, 1)
will result in %1010
(%1000
equals decimal eight, and %1010
is ten).
comparative remarks
Note: The concept of sets is an integral part of Pascal. Whilst in other programming languages considering operations on the bit level is not unusual, Pascal provides you with a powerful notion that relieves you from the burden of thinking about bits. Take it under advisement whether your programming task can be modeled with sets even better.
When using sets a plus sign +
virtually does the same as the bitwise or
does (depends on the compiler’s implementation of the data type set
).
This notation is, as already mentioned above, familiar from electrical engineering.
However, when handling sets the bitwise or
is called a union (of sets).
see also
- § “boolean operators” in the “Free Pascal Reference Guide” regarding the logical disjunction
- § “logical operators” in the “Free Pascal Reference Guide” regarding the bitwise
or
and
xor
system.logicalor