1. 程式人生 > >Lua5.3 異或操作的一個坑

Lua5.3 異或操作的一個坑

最近在開發專案時,需要用到Lua的一些位操作,其中用到了異或,寫程式碼的時候想當然的就以為在Lua5.3裡,異或操作也像C語言一樣是^, 然後就寫下去了,

跑的時候也沒報錯,就沒有再去深究這個符號的意義,直到再次測試這段程式碼的時候,發現結果怎麼也不對,之前寫的“異或”,得出來的結果居然是inf, 無窮大,於是,在繞了很多彎路,寫過各種測試程式碼後得知:^此符號不是異或。

而實際上,在Lua5.3裡,^是乘方,~才是異或,這一點實在是坑,因為~還是按位非符號,這裡貼出雲風的參考手冊,希望大家能少踩此坑:

Lua 支援下列數學運算操作符:

  • +加法
  • -減法
  • *乘法
  • /浮點除法
  • //向下取整除法
  • %取模
  • ^乘方
  • -取負

除了乘方和浮點除法運算, 數學運算按如下方式工作: 如果兩個運算元都是整數, 該操作以整數方式操作且結果也將是一個整數。 否則,當兩個運算元都是數字或可以被轉換為數字的字串 (參見 §3.4.3)時, 運算元會被轉換成兩個浮點數, 操作按通常的浮點規則(一般遵循 IEEE 754 標準) 來進行,結果也是一個浮點數。

乘方和浮點除法 (/) 總是把運算元轉換成浮點數進行,其結果總是浮點數。 乘方使用 ISO C 函式 pow, 因此它也可以接受非整數的指數。

向下取整的除法 (//) 指做一次除法,並將商圓整到靠近負無窮的一側, 即對運算元做除法後取 floor 。

取模被定義成除法的餘數,其商被圓整到靠近負無窮的一側(向下取整的除法)。

對於整數數學運算的溢位問題, 這些操作採取的策略是按通常遵循的以 2 為補碼的數學運算的 環繞 規則。 (換句話說,它們返回其運算的數學結果對 264 取模後的數字。)

3.4.2 – 位操作符

Lua 支援下列位操作符:

  • &按位與
  • |按位或
  • ~按位異或
  • >>右移
  • <<左移
  • ~按位非

所有的位操作都將運算元先轉換為整數 (參見 §3.4.3), 然後按位操作,其結果是一個整數。

對於右移和左移,均用零來填補空位。 移動的位數若為負,則向反方向位移; 若移動的位數的絕對值大於等於 整數本身的位數,其結果為零 (所有位都被移出)。

============================= 所以說還是對Lua5.3不熟悉啊,當時參與此專案之前,對Lua還基本不會,不過Lua實在是太好上手了,這也是它的優點之一,所以基本沒怎麼看過參考手冊,也沒看過書,基本上照著別人程式碼邊看邊寫,遇到不會的就問下同事,所以導致這些細節方面容易出問題。 看來抽空還是要深入學習下這些語言細節。

相關推薦

Lua5.3 操作一個

最近在開發專案時,需要用到Lua的一些位操作,其中用到了異或,寫程式碼的時候想當然的就以為在Lua5.3裡,異或操作也像C語言一樣是^, 然後就寫下去了, 跑的時候也沒報錯,就沒有再去深究這個符號的意義,直到再次測試這段程式碼的時候,發現結果怎麼也不對,之前寫的“異或”,得

操作實現的交換函數用以實現數組逆置中須要註意的問題

span include style 試題 blog text fontsize lib mod 用元素交換函數實現數組逆置非常easy,如以下代碼:(數組左右元素交換) #include<iostream> #include<stdlib.h>

C++ 中的操作^

you 整型 lin 不存在 要求 -s cal tar rda 好好的利用異或能夠產生奇妙的效果。 異或運算的性質: 不論什麽一個數字異或它自己都等於0。也就是說。假設我們從頭到尾依次異或數組中的每個數字,那麽終於的結果剛好是那個僅僅出現一次的數字。由於那些出現兩次的

關於操作和它的算法題

出現一次 實現 enum blank href sin 結果 com for 首先一篇文章推薦:感受異或的神奇,其中介紹了什麽是異或,異或的定律:恒等律,歸零律,交換律,結合律,以及一些常見用法和一個算法系列。非常好! 這個算法系列指的是:已知一個數組中除了1(2,3)個數

為什麽三次操作可以交換兩個數

找到 原來 們的 異或操作 去掉 進制 ont 交換兩個數 一位 a和b是兩個整數,經過以下三次異或操作,可以達到交換目的:a = a ^ b;b = a ^ b;a = a ^ b; 首先要理解,什麽是^(異或)操作:  二進制兩數運算結果:  0 ^ 0 = 0  

深入理解操作

接觸C語言有好多年了,工作中一直沒用過位操作,所以也一直沒有注意異或操作。突然發現自己對異或操作理解的並不是那麼深刻。好吧,重新學習一下。 位操作預算有以下幾種 位操作運算 功能 符號 用法 位求反

Base64編碼+兩串操作

使用到jar包:commons-codec.jar /** * base64編碼 * * @param s * @param key * @return */ public static String encode(String s, String key)

常見位操作及運算應用舉例:1,C語言中位運算子“∧”的作用2,運算的作用3,&(與運算)、|(運算)、^(運算)

  1 C語言中位運算子異或“∧”的作用: 異或運算子∧也稱XOR運算子。它的規則是若參加運算的兩個二進位同號,則結果為0(假);異號則為1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,結果為023(八進位制數)。 “異或”的意思是判斷兩個相應的位值是否為“

1到n,n個整數連續的值(1 xor 2 xor 3 ... .. xor n)

。。 nbsp 異或 == ... n) 暴力 bsp 連續 暴力推,前12個數如下: 1 3 0 4 1 7 0 8 1 11 0 12 。。。。 所以對於任意的 n 有如下結論: if : n % 4 == 1 ans

「LOJ#10051」「一本通 2.33」Nikitosh 和

sizeof nts class challenge inf 技術分享 big ron urn 題目描述 原題來自:CODECHEF September Challenge 2015 REBXOR 1??≤r?1??<l?2??≤r?2

「LOJ#10051」「一本通 2.33」Nikitosh 和 「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair(Trie

題目描述 原題來自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 xxx 和 yyy 的按位異或。

direct IO 核心實現分析及揭示一個——基於3.10.0-693.11.1

linux的讀寫系統呼叫提供了一個O_DIRECT標記,可以讓嘗試繞過快取,直接對磁碟進行讀寫(為啥是嘗試繞過?當直接落盤失敗時還要通過快取去落盤)。為了能實現直接落盤,使用direct IO限制多多,檔案偏移得對齊到磁碟block,記憶體地址得對齊到磁碟block,讀寫size也得對齊

C++位操作與、、非、、取反詳解

一、按位邏輯運算子 1,按位取反~ 如:~(10)結果位(01) ~var不會改變var的值,如果要改var值,可以為var=~var; 2,按位與& 有0得0,全1出1 var&=300等價於var=var&300 3,按位或| 有1出1,全

opencv+QT實現影象操作(影象的與、、取反、兩影象相減、RGB轉YUV、YUV轉RG等等)

需求簡介: 由於最近在做影象處理的專案,有時候需要快速的知道影象的最大畫素值和最小畫素值是多少,或者影象的最大最小畫素的座標在哪裡。需要快速的得到RGB影象中的R、G、B當中的某個通道。需要把RGB影象轉成YUV資料儲存。需要把YUV資料轉成RGB圖片儲存。當每次需要用到這

mybatis 批量更新操作一個

``` <update id="batchUpdateAlbumRecordContentIds" parameterType="java.util.List"> <foreach collection="list" item="record" ind

一個最簡單的加密解密演算法 人人能懂 加密

                #include <iostream>// KEY 非常重要,不能對公眾洩露KEY值// 傳送端和接收端提前祕密約定好KEY值#define KEY 1313113 // 萬歲萬歲萬萬歲using namespace std;// 加密演算法可以公開int encr

【折半搜尋 && 左上到右下等於 k 的方案數】Codeforces Round #498 (Div. 3) F. Xor-Paths

Step1 Problem: 給你 n*m 的矩陣,從 (1, 1) 到 (n, m) 只能往下和往右走,路徑上的數異或起來等於 k 的路徑數。 資料範圍: 1<=n, m <= 20. 0 <= k <= 1e18.

pgpool(3.6.5)的一個

在現場環境中突然發現spark application卡死,而卡死的狀態又與普通的阻塞不同,看起來就是執行了一部分job之後,後面的Job都沒有提交了。 而更為詭異的是,如果把指向不用pgpool,而直接用一個普通的pg庫,整個spark application是正常的。

關於運算的一個問題

之前在一個群裡有一朋友問,給定一個整數序列,其中除了某個數n是單個出現外,其餘的數都是成對出現,問怎麼求出這個單個的數n,且儘可能小的空間複雜度和時間複雜度。 這個問題第一反應就是異或,因為之前對這類問題是有個大概想法的。因為我知道用異或可以不用第三方變數就可

二進位制位 : 操作

& 按位與 | 按位或 ^ 按位異或 1. 按位與運算 按位與運算子"&"是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。 例如:9&5可寫算式如下: 000