루아는 64 비트 정수를 사용합니까? 어떻게 사용합니까?루아는 64 비트 정수를 사용합니까?
답변
직접 컴파일하십시오. 루아는 기본적으로 배정 밀도 부동 소수점 숫자를 사용합니다. 그러나 이는 소스 (luaconf.h
, LUA_NUMBER
)에서 변경할 수 있습니다.
require "bit"
-- Lua unsigned 64bit emulated bitwises
-- Slow. But it works.
function i64(v)
local o = {}; o.l = v; o.h = 0; return o;
end -- constructor +assign 32-bit value
function i64_ax(h,l)
local o = {}; o.l = l; o.h = h; return o;
end -- +assign 64-bit v.as 2 regs
function i64u(x)
return (((bit.rshift(x,1) * 2) + bit.band(x,1)) % (0xFFFFFFFF+1));
end -- keeps [1+0..0xFFFFFFFFF]
function i64_clone(x)
local o = {}; o.l = x.l; o.h = x.h; return o;
end -- +assign regs
-- Type conversions
function i64_toInt(a)
return (a.l + (a.h * (0xFFFFFFFF+1)));
end -- value=2^53 or even less, so better use a.l value
function i64_toString(a)
local s1=string.format("%x",a.l);
local s2=string.format("%x",a.h);
local s3="0000000000000000";
s3=string.sub(s3,1,16-string.len(s1))..s1;
s3=string.sub(s3,1,8-string.len(s2))..s2..string.sub(s3,9);
return "0x"..string.upper(s3);
end
-- Bitwise operators (the main functionality)
function i64_and(a,b)
local o = {}; o.l = i64u(bit.band(a.l, b.l)); o.h = i64u(bit.band(a.h, b.h)); return o;
end
function i64_or(a,b)
local o = {}; o.l = i64u(bit.bor(a.l, b.l)); o.h = i64u(bit.bor(a.h, b.h)); return o;
end
function i64_xor(a,b)
local o = {}; o.l = i64u(bit.bxor(a.l, b.l)); o.h = i64u(bit.bxor(a.h, b.h)); return o;
end
function i64_not(a)
local o = {}; o.l = i64u(bit.bnot(a.l)); o.h = i64u(bit.bnot(a.h)); return o;
end
function i64_neg(a)
return i64_add(i64_not(a), i64(1));
end -- negative is inverted and incremented by +1
-- Simple Math-functions
-- just to add, not rounded for overflows
function i64_add(a,b)
local o = {};
o.l = a.l + b.l;
local r = o.l - 0xFFFFFFFF;
o.h = a.h + b.h;
if(r>0) then
o.h = o.h + 1;
o.l = r-1;
end
return o;
end
-- verify a>=b before usage
function i64_sub(a,b)
local o = {}
o.l = a.l - b.l;
o.h = a.h - b.h;
if(o.l<0) then
o.h = o.h - 1;
o.l = o.l + 0xFFFFFFFF+1;
end
return o;
end
-- x n-times
function i64_by(a,n)
local o = {};
o.l = a.l;
o.h = a.h;
for i=2, n, 1 do
o = i64_add(o,a);
end
return o;
end
-- no divisions
-- Bit-shifting
function i64_lshift(a,n)
local o = {};
if(n==0) then
o.l=a.l; o.h=a.h;
else
if(n<32) then
o.l= i64u(bit.lshift(a.l, n)); o.h=i64u(bit.lshift(a.h, n))+ bit.rshift(a.l, (32-n));
else
o.l=0; o.h=i64u(bit.lshift(a.l, (n-32)));
end
end
return o;
end
function i64_rshift(a,n)
local o = {};
if(n==0) then
o.l=a.l; o.h=a.h;
else
if(n<32) then
o.l= bit.rshift(a.l, n)+i64u(bit.lshift(a.h, (32-n))); o.h=bit.rshift(a.h, n);
else
o.l=bit.rshift(a.h, (n-32)); o.h=0;
end
end
return o;
end
-- Comparisons
function i64_eq(a,b)
return ((a.h == b.h) and (a.l == b.l));
end
function i64_ne(a,b)
return ((a.h ~= b.h) or (a.l ~= b.l));
end
function i64_gt(a,b)
return ((a.h > b.h) or ((a.h == b.h) and (a.l > b.l)));
end
function i64_ge(a,b)
return ((a.h > b.h) or ((a.h == b.h) and (a.l >= b.l)));
end
function i64_lt(a,b)
return ((a.h < b.h) or ((a.h == b.h) and (a.l < b.l)));
end
function i64_le(a,b)
return ((a.h < b.h) or ((a.h == b.h) and (a.l <= b.l)));
end
-- samples
a = i64(1); -- 1
b = i64_ax(0x1,0); -- 4294967296 = 2^32
a = i64_lshift(a,32); -- now i64_eq(a,b)==true
print(i64_toInt(b)+1); -- 4294967297
X = i64_ax(0x00FFF0FF, 0xFFF0FFFF);
Y = i64_ax(0x00000FF0, 0xFF0000FF);
-- swap algorithm
X = i64_xor(X,Y);
Y = i64_xor(X,Y);
X = i64_xor(X,Y);
print("X="..i64_toString(X)); -- 0x00000FF0FF0000FF
print("Y="..i64_toString(Y)); -- 0x00FFF0FFFFF0FFFF
arithmeric 연산자를 지원하는 metatable 필드가있는 클래스를 정의하지 않는 이유는 무엇입니까? 왜이 숫자를 10 진수 문자열로 변환하는 기능이 없습니까 (이 함수를 '__string'메타 테이블에 바인딩 할 수도 있습니다)? 참고 : 루아가 IEEE 64 비트 double 형 숫자를 지원하도록 컴파일 된 경우, 절대 값 <= (2^53) 인 모든 숫자가 정확하게 저장됩니다. –
루아 5.3은 기본적으로 64 비트 정수를 사용하는 정수 하위 유형을 도입했습니다.
로부터 입력 수는 2 개 내부 표현 번 정수라고 불리는 다른 플로트를 사용한다. 루아는 각 표현의 사용시기에 대한 명시적인 규칙을 가지고 있지만 필요에 따라 자동으로 표현을 변환합니다 (§3.4.3 참조). 따라서 프로그래머는 정수와 부동 소수점의 차이점을 대부분 무시하거나 각 숫자의 표현을 완전히 제어 할 수 있습니다. 표준 루아는 64 비트 정수와 배정도 (64 비트) 부동 소수점을 사용하지만 32 비트 정수 및/또는 단 정밀도 (32 비트) 부동 소수점을 사용하도록 Lua를 컴파일 할 수도 있습니다. 정수 및 부동 소수점 모두에 대해 32 비트 옵션은 소형 시스템 및 임베디드 시스템에 특히 유용합니다. (매크로
LUA_32BITS
파일의luaconf.h
을 참조하십시오.)
예, 정확한 값을 저장하기 위해 32 비트 정수 또는 문자열 배열을 사용하는 에뮬레이션보다 훨씬 빠릅니다. 그러나 Lua는 C 또는 C++ (예 : PHP, Java 또는 Javascript)의 다른 호스트 언어로도 쉽게 이식 될 수 있으며 다른 네이티브 숫자 데이터 유형 또는 더 높은 정밀도의 숫자 (예 : x86 구조에서는 80 비트 길이가 긴 숫자) . 에뮬레이션을 사용하면 Lua에서 복소수 또는 행렬을 지원할 수도 있습니다. –
- 1. 64 비트 유형을 사용합니까?
- 2. 64 비트 Windows에서 KERNEL64를 사용합니까?
- 3. PHP : 64 비트 정수를 문자열로 변환
- 4. PHP에 64 비트 정수를 저장하는 방법은 무엇입니까?
- 5. 32 비트 부호없는 정수를 사용하여 64 비트 수를 곱하는 알고리즘
- 6. long (64 비트) 정수를 지원하는 스크립트 언어는 무엇입니까?
- 7. Jet 엔진 (액세스) 데이터베이스에 64 비트 정수를 저장 하시겠습니까?
- 8. 두 개의 32 비트 정수를 C에서 64 비트로 사용하려면 어떻게해야합니까?
- 9. 64 비트 컴퓨터에서 C++ 포인터
- 10. 64 비트 파이썬은 32 비트 Windows
- 11. 32 비트 64 비트 호환
- 12. 32 비트/64 비트 OS?
- 13. 큰 정수를 사용한 비트 연산
- 14. 64 비트 라이브러리는 4GB로 제한됩니까?
- 15. 포트란 : 32 비트/64 비트 성능 이식성
- 16. 부호가있는 64 비트 값을 사용하여 SQL 및 C#에서 128 비트 부호없는 정수를 시뮬레이트 하시겠습니까?
- 17. Ruby에서 두 개의 32 비트 정수로 64 비트 정수를 저장하는 방법
- 18. 64 비트 Java 응용 프로그램 : 64 비트 OS, 64 비트 JRE 및 64 비트 응용 프로그램이 필요합니까?
- 19. 해시 32 비트 정수를 16 비트 정수로 변환 하시겠습니까?
- 20. 64 비트 10 진수는 32 비트 주소에 어떻게 저장됩니까?
- 21. 64 비트 시스템에서 64 비트 설치 프로그램을 사용하기위한 시작 조건
- 22. Win 7 (64 비트)에서 SAS 9.2 (64 비트) 성능
- 23. 64 비트 .NET 코드에서 64 비트 C++ 디버깅 - 방법?
- 24. 64 비트 Linux에서 dbxtool은 64 비트 버전의 dbx를로드하지 않습니다.
- 25. 64 비트 CentOS에서 64 비트 이진 실행 오류가 발생했습니다.
- 26. Windows에서 mod_jk 64 비트
- 27. 컴파일 OpenBUGS 64 비트
- 28. 64 비트 배포
- 29. 64 비트 시스템의 GDI +
- 30. 64 비트 ODBC 예외
명확하게하기 위해 루아는 단일 수치 데이터 유형을가집니다. 기본적으로 이것은 'double'이지만 헤더 파일에서'int64_t '와 같은 다른 유형으로 변경할 수 있습니다. –
'luaconf.h'에서 숫자 타입을 변경했다면, 관련된 매크로를 적절하게 변경하는 것을 잊지 마십시오. – lhf
@lhf : 매크로 바로 위에 문서화되어 있기 때문에 꽤 발견 될 것이라고 생각했습니다. – Joey