<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns:MadCap="http://www.madcapsoftware.com/Schemas/MadCap.xsd" MadCap:lastBlockDepth="6" MadCap:lastHeight="94" MadCap:lastWidth="853" MadCap:disableMasterStylesheet="true" MadCap:tocPath="PBASIC Language Reference|PBASIC Operators" MadCap:InPreviewMode="false" MadCap:PreloadImages="false" MadCap:RuntimeFileType="Topic" MadCap:TargetType="WebHelp" lang="en-us" xml:lang="en-us" MadCap:PathToHelpSystem="../../../" MadCap:HelpSystemFileName="Default.xml" MadCap:SearchType="Stem"> <head><title>Unary Operators</title> <link href="../../SkinSupport/MadCap.css" rel="stylesheet" /> <link href="../../Resources/Stylesheets/BSE_Help.css" rel="stylesheet" /> <script src="../../SkinSupport/MadCapAll.js"> </script> </head> <body> <div class="MCBreadcrumbsBox_0"><span class="MCBreadcrumbsPrefix">You are here: </span><a class="MCBreadcrumbsLink" href="AlphaRef.htm">PBASIC Language Reference</a><span class="MCBreadcrumbsDivider"> > </span><a class="MCBreadcrumbsLink" href="Operators.htm">PBASIC Operators</a><span class="MCBreadcrumbsDivider"> > </span><span class="MCBreadcrumbs">Unary Operators</span> </div> <h1>Unary Operators</h1> <p> <img src="../../graphics/pgm_icon1.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2e.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2sx.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2p.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2pe.gif" border="0" alt="" /> <img src="../../graphics/pgm_icon2px.gif" border="0" alt="" /> </p> <p> </p> <p class="PlainText">Unary operators work with a single argument. Click on any operator in the list below for details and examples.</p> <p class="PlainText">(See also: <a href="Ops_bi.htm" target="" title="" alt="" class="MCXref_0">Binary Operators</a> and <a href="OpsPrecedence.htm" target="" title="" alt="" class="MCXref_0">Operator Precedence</a>.)</p> <h2>Notes about the 16-bit workspace</h2> <p class="PlainText">Many of the operator descriptions will say something like "computes (some function) of a 16-bit number." This does not mean that the operator does not work on smaller byte or nibble values, but rather that the computation is done in a 16-bit workspace. If the value is smaller than 16 bits, the BASIC Stamp pads it with leading 0s to make a 16-bit value. If the 16-bit result of a calculation is to be packed into a smaller variable, the higher-order bits are discarded (truncated).</p> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_0" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />ABS   (Returns Absolute Value)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_0" style="display: none;"> <p> </p> <p class="PlainText"><a name="absval"></a>The Absolute Value operator (ABS) converts a signed (two’s complement) 16-bit number to its absolute value. The absolute value of a number is a positive number representing the difference between that number and 0. For example, the absolute value of -99 is 99. The absolute value of 99 is also 99. ABS works on two’s complement negative numbers. Here's an example of ABS at work:</p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> result VAR Word Main: result = -99 DEBUG SDEC ? result ' Display -99 DEBUG SDEC ? ABS result ' Display 99 END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_1" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />-   (Negate)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_1" style="display: none;"> <p> </p> <p class="PlainText"><a name="negative"></a>The Negative operator (-) negates a 16-bit number (converts to its two’s complement).</p> <img src="../../graphics/bs1_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> SYMBOL result = W1 Main: result = -99 ' Initialize result result = result + 100 ' Add 100 to it DEBUG result ' Display result (1) END </pre> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> result VAR Word Main: result = -99 ' Initialize result DEBUG SDEC result ' Display result (-99) result = result + 100 ' Add 100 to it DEBUG SDEC result ' Display result (1) END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_2" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />~   (Invert Bits)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_2" style="display: none;"> <p> </p> <p class="PlainText"><a name="invert"></a>The Inverse operator (~) complements (inverts) the bits of a number. Each bit that contains a 1 is changed to 0 and each bit containing 0 is changed to 1. This process is also known as a "bitwise NOT" and one's complement.</p> <p class="PlainText"><span class="code_in_text">    ~0 = 1     ~1 = 0</span> </p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> result VAR Byte Main: result = %11110001 ' Store bits in result DEBUG BIN8 ? result ' Display %11110001 result = ~result ' Complement result DEBUG BIN8 ? result ' Display %00001110 END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_3" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />DCD   (2<sup>n</sup> power Decoder)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_3" style="display: none;"> <p> </p> <p class="PlainText"><a name="dcd"></a>The Decoder operator (DCD) is a 2<sup>n</sup>-power decoder of a four-bit value. DCD accepts a value from 0 to 15, and returns a 16-bit number with the bit, described by value, set to 1.</p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> result VAR Word Main: result = DCD 12 ' Set bit 12. DEBUG BIN ? result ' Display %0001000000000000 END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_4" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />NCD   (Priority Encoder of 16-bit Value)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_4" style="display: none;"> <p> </p> <p class="PlainText"><a name="ncd"></a>The Encoder operator (NCD) is a "priority" encoder of a 16-bit value. NCD takes a 16-bit value, finds the highest bit containing a 1 and returns the bit position plus one (1 through 16). If no bit is set (the input value is 0) NCD returns 0. NCD is a fast way to get an answer to the question "What is the largest power of two that this value is greater than or equal to?" The value NCD returns will be that power, plus one.</p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> result VAR Nib Main: result = %1101 ' Highest bit set is bit 3 DEBUG ? NCD result ' Show the NCD of Result (4) END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_5" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />SIN   (Returns signed Sine of Angle)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_5" style="display: none;"> <p> </p> <p class="PlainText"><a name="sine"></a>The Sine operator (SIN) returns the two’s complement, 16-bit Sine of an angle specified as an 8-bit (0 to 255) value. To understand the SIN operator more completely, let’s look at a typical Sine function. By definition: given a circle with a radius of 1 unit (known as a unit circle), the Sine is the y-coordinate distance from the center of the circle to its edge at a given angle. Angles are measured relative to the 3-o'clock position on the circle, increasing as you go around the circle counterclockwise.</p> <p class="PlainText">At the origin point (0 degrees) the Sine is 0, because that point has the same y (vertical) coordinate as the circle center. At 45 degrees the Sine is 0.707. At 90 degrees, Sine is 1. At 180 degrees, Sine is 0 again. At 270 degrees, Sine is -1.</p> <p class="PlainText">The BASIC Stamp SIN operator breaks the circle into 0 to 255 units instead of 0 to 359 degrees. Some textbooks call this unit a binary radian or brad. Each brad is equivalent to 1.406 degrees. And instead of a unit circle, which results in fractional Sine values between 0 and 1, BASIC Stamp SIN is based on a 127-unit circle. Results are given in two’s complement form in order to accommodate negative values. So, at the origin, SIN is 0. At 45 degrees (32 brads), Sine is 90. At 90 degrees (64 brads), Sine is 127. At 180 degrees (128 brads), Sine is 0 again. At 270 degrees (192 brads), Sine is -127.</p> <p class="PlainText">See the image below for the relationship between degrees and brads and how the SIN function values relate to to the 127-unit circle.</p> <p class="PlainText" style="text-align: center;"> <img src="../../graphics/SIN_COS.png" /> </p> <center> </center> <p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /> </p><pre class="BScode" xml:space="preserve"> degr VAR Word sine VAR Word Main: FOR degr = 0 TO 359 STEP 45 ' Use degrees sine = SIN (degr * 128 / 180) ' Convert to brads, do SIN DEBUG "Angle: ", DEC degr, TAB ' Display results DEBUG "Sine: ", SDEC sine, CR NEXT END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_6" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />COS   (Returns signed Cosine of Angle)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_6" style="display: none;"> <p> </p> <p class="PlainText"><a name="cosine"></a>The Cosine operator (COS) returns the two’s complement, 16-bit Cosine of an angle specified as an 8-bit (0 to 255) value. To understand the COS operator more completely, let’s look at a typical Cosine function. By definition: given a circle with a radius of 1 unit (known as a unit circle), the Cosine is the x-coordinate distance from the center of the circle to its edge at a given angle. Angles are measured relative to the 3-o'clock position on the circle, increasing as you go around the circle counterclockwise.</p> <p class="PlainText">At the origin point (0 degrees) the Cosine is 1, because that point has the same x (horizontal) coordinate as the circle radius. At 45 degrees the Cosine is 0.707. At 90 degrees, Cosine is 0. At 180 degrees, Cosine is -1. At 270 degrees, Cosine is 0 again.</p> <p class="PlainText">The BASIC Stamp COS operator breaks the circle into 0 to 255 units instead of 0 to 359 degrees. Some textbooks call this unit a binary radian or brad. Each brad is equivalent to 1.406 degrees. And instead of a unit circle, which results in fractional Cosine values between 0 and 1, BASIC Stamp COS is based on a 127-unit circle. Results are given in two’s complement form in order to accommodate negative values. So, at the origin, COS is 127. At 45 degrees (32 brads), COS is 90. At 90 degrees (64 brads), COS is 0. At 180 degrees (128 brads), Cosine is -127. At 270 degrees (192 brads), Cosine is 0 again.</p> <p class="PlainText">See the image below for the relationship between degrees and brads and how the COS function values relate to to the 127-unit circle.</p> <center> <img src="../../graphics/SIN_COS.png" border="0" alt="" /> </center> <p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /> </p><pre class="BScode" xml:space="preserve"> degr VAR Word cosine VAR Word Main: FOR degr = 0 TO 359 STEP 45 ' Use degrees cosine = COS (degr * 128 / 180) ' Convert to brads, do COS DEBUG "Angle: ", DEC degr, TAB ' Display results DEBUG "Cosine: ", SDEC cosine, CR NEXT END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_7" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />SQR   (Returns Square Root of Value)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_7" style="display: none;"> <p> </p> <p class="PlainText"><a name="square"></a>The Square Root operator (SQR) computes the integer square root of an unsigned 16-bit number. (The number must be unsigned since the square root of a negative number is an 'imaginary' number.) Remember that most square roots have a fractional part that the BASIC Stamp discards when doing its integer-only math. So it computes the square root of 100 as 10 (correct), but the square root of 99 as 9 (the actual is close to 9.95).</p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> Main: DEBUG SQR 100 ' Display 10 DEBUG SQR 99 ' Display 9 (due to truncation) END </pre> </div> </div> <div class="MCDropDown"> <div class="MCDropDownHead_0"><a class="MCDropDownHotSpot_0" href="javascript:void(0);" id="MCDropDownHotSpot_1311391400_8" onclick="FMCDropDown( this ); return false;"><img style="border: none;margin-right: 2px;" src="../../SkinSupport/DropDownClosed.gif" MadCap:altsrc="../../SkinSupport/DropDownOpen.gif" onload="if ( typeof( FMCPreloadImage ) == 'function' ) { FMCPreloadImage( '../../SkinSupport/DropDownOpen.gif' ); }" class="MCDropDownIcon" />NOT   (Logical NOT)</a> </div> <div class="MCDropDownBody" id="MCDropDownBody_1311391400_8" style="display: none;"> <p> </p> <p class="PlainText"><a name="not"></a>The NOT operator returns the logical NOT of an expression. Note that in the BASIC Stamp, a non-zero value is considered True (T), zero is considered False (F). The expression is subject to the following logic:</p> <p class="PlainText"><tt>  <span class="code_in_text">  NOT F = T     NOT T = F</span></tt> </p> <p class="PlainText">The result returned by NOT will be True or False.</p> <img src="../../graphics/bs2all_inline.gif" border="0" alt="" /><pre class="BScode" xml:space="preserve"> speed VAR Byte Main: DEBUG CLS, "Enter speed: " DEBUGIN DEC speed IF NOT (speed < 65) THEN ' speed must be less than 65 DEBUG CR, "Sorry ... too fast!" ELSE DEBUG CR, "Enjoy your trip." ENDIF END </pre> </div> </div> <p> </p> <div class="Col2"> <div class="MasterFoot"> <p MadCap:conditions="BSEconditions.BSEWebHelp (Primary)-INCLUDE"><a href="../../HomeTopics/HomePage.htm">Go to Welcome page</a> </p> </div> </div> <div class="Col2"> <div class="MasterFoot"> <p style="text-align: right;"><span class="ContactInfoProjectName">BASIC Stamp Help</span> <![CDATA[ ]]><span class="ContactInfoVersion#">Version 2.5.4</span> <![CDATA[ ]]></p> <p style="text-align: right;">Copyright © <span class="ContactInfoCompanyName">Parallax Inc.</span></p> <p style="text-align: right;"><span class="SystemShortDate">8/8/2012</span> </p> </div> </div> <script type="text/javascript">/* <![CDATA[ */ var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-285614-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); /* ]]> */</script> <script type="text/javascript" src="../../SkinSupport/MadCapBodyEnd.js"> </script> </body> </html>