Security News
GitHub Removes Malicious Pull Requests Targeting Open Source Repositories
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
The cuint npm package provides utilities for handling unsigned integers of various sizes, particularly useful in environments where native support for large integers is limited or non-existent. It allows for the creation, manipulation, and arithmetic of unsigned integers beyond JavaScript's native Number limits.
Creation of unsigned integers
This feature allows the creation of 32-bit unsigned integers. The example shows how to create a UINT32 instance and print its value.
const UINT32 = require('cuint').UINT32;
const uint = UINT32(123456789);
console.log(uint.toString());
Arithmetic operations
This feature supports basic arithmetic operations such as addition. The code sample demonstrates adding two UINT32 instances.
const UINT32 = require('cuint').UINT32;
const a = UINT32('123456789');
const b = UINT32('987654321');
const result = a.add(b);
console.log(result.toString());
Bitwise operations
This feature supports bitwise operations like AND. The example illustrates performing a bitwise AND between two UINT32 instances.
const UINT32 = require('cuint').UINT32;
const a = UINT32('4294967295');
const result = a.and(UINT32('123456789'));
console.log(result.toString());
The bignum package also provides support for large integer arithmetic. It offers more extensive functionality including support for both signed and unsigned integers, as well as more complex operations like exponentiation and division, which makes it more versatile compared to cuint.
big-integer is another package that handles large integers. Unlike cuint, which is limited to unsigned integers, big-integer supports both signed and unsigned integers and provides a richer set of features including modular arithmetic and prime testing.
Javascript does not natively support handling of unsigned 32 or 64 bits integers. This library provides that functionality, following C behaviour, enabling the writing of algorithms that depend on it. It was designed with performance in mind and tries its best to be as fast as possible. Any improvement is welcome!
An unsigned 32 bits integer is represented by an object with its first 16 bits (low bits) and its 16 last ones (high bits). All the supported standard operations on the unsigned integer are then performed transparently.
e.g.
10000010000100000100010000100010 (2182104098 or 0x82104422) is represented by:
high=1000001000010000
low= 0100010000100010
NB. In case of overflow, the unsigned integer is truncated to its lowest 32 bits (in case of UINT32) or 64 bits (in case of UINT64).
The same applies to 64 bits integers, which are split into 4 16 bits ones.
In nodejs:
npm install cuint
In the browser, include the following (file is located in the build directory), and access the constructor with UINT32:
` ...
`To instantiate an unsigned 32 bits integer, do any of the following:
var UINT32 = require('cuint').UINT32 // NodeJS
UINT32( <low bits>, <high bits> )
UINT32( <number> )
UINT32( '<number>', <radix> ) // radix = 10 by default
To instantiate an unsigned 64 bits integer, do any of the following:
var UINT64 = require('cuint').UINT64 // NodeJS
UINT64( <low bits>, <high bits> )
UINT64( <first low bits>, <second low bits>, <first high bits>, <second high bits> )
UINT64( <number> )
UINT64( '<number>', <radix> ) // radix = 10 by default
Most methods do modify the object they are applied to. For instance, the following is equivalent to x += y
UINT(x).add( UINT(y) )
This allows for chaining and reduces the cost of the emulation.
To have z = x + y
, do the following:
z = UINT(x).clone().add( UINT(y) )
UINT32( 2, 1 ) // 65538
{ remainder: null, _low: 2, _high: 1 }
UINT32( 65538 ) // 65538
{ remainder: null, _low: 2, _high: 1 }
UINT32( '65538' ) // 65538
{ remainder: null, _low: 2, _high: 1 }
UINT32( '3266489917' )
{ remainder: null, _low: 44605, _high: 49842 }
UINT32( '3266489917' ).div( UINT32( '668265263' ) )
{ remainder: { remainder: null , _low: 385 , _high: 9055 } , _low: 4 , _high: 0 }
UINT64( 2, 1 ) // 4294967298
{ remainder: null, _a00: 2, _a16: 0, _a32: 1, _a48: 0 }
UINT64( 2, 1, 0, 0 ) // 65538
{ remainder: null, _a00: 2, _a16: 1, _a32: 0, _a48: 0 }
UINT64( 65538 ) // 65538
{ remainder: null, _a00: 2, _a16: 1, _a32: 0, _a48: 0 }
UINT64( '65538' ) // 65538
{ remainder: null, _a00: 2, _a16: 1, _a32: 0, _a48: 0 }
UINT64( '3266489917' )
{ remainder: null, _a00: 44605, _a16: 49842, _a32: 0, _a48: 0 }
UINT64( 'F00000000000', 16 ).div( UINT64( '800000000000', 16 ) )
{ remainder: { remainder: null, _a00: 0, _a16: 0, _a32: 28672, _a48: 0 }, _a00: 1, _a16: 0, _a32: 0, _a48: 0 }
Methods specific to UINT32 and UINT64:
UINT32.fromBits(<low bits>, <high bits>)*
Set the current UINT32 object with its low and high bitsUINT64.fromBits(<low bits>, <high bits>)*
Set the current UINT64 object with its low and high bitsUINT64.fromBits(<first low bits>, <second low bits>, <first high bits>, <second high bits>)*
Set the current UINT64 object with all its low and high bitsMethods common to UINT32 and UINT64:
UINT.fromNumber(<number>)*
Set the current UINT object from a number (first 32 bits only)UINT.fromString(<string>, <radix>)
Set the current UINT object from a stringUINT.toNumber()
Convert this UINT to a numberUINT.toString(<radix>)
Convert this UINT to a stringUINT.add(<uint>)*
Add two UINT. The current UINT stores the resultUINT.subtract(<uint>)*
Subtract two UINT. The current UINT stores the resultUINT.multiply(<uint>)*
Multiply two UINT. The current UINT stores the resultUINT.div(<uint>)*
Divide two UINT. The current UINT stores the result.
The remainder is made available as the remainder property on the UINT object.
It can be null, meaning there are no remainder.UINT.negate()
alias UINT.not()
Negate the current UINTUINT.equals(<uint>)
alias UINT.eq(<uint>)
EqualsUINT.lessThan(<uint>)
alias UINT.lt(<uint>)
Less than (strict)UINT.greaterThan(<uint>)
alias UINT.gt(<uint>)
Greater than (strict)UINT.or(<uint>)*
Bitwise ORUINT.and(<uint>)*
Bitwise ANDUINT.xor(<uint>)*
Bitwise XORUINT.shiftRight(<number>)*
alias UINT.shiftr(<number>)*
Bitwise shift rightUINT.shiftLeft(<number>[, <allowOverflow>])*
alias UINT.shiftl(<number>[, <allowOverflow>])*
Bitwise shift leftUINT.rotateLeft(<number>)*
alias UINT.rotl(<number>)*
Bitwise rotate leftUINT.rotateRight(<number>)*
alias UINT.rotr(<number>)*
Bitwise rotate rightUINT.clone()
Clone the current UINTNB. methods with an * do modify the object it is applied to. Input objects are not modified.
MIT
Written with StackEdit.
FAQs
Unsigned integers for Javascript
We found that cuint demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
GitHub removed 27 malicious pull requests attempting to inject harmful code across multiple open source repositories, in another round of low-effort attacks.
Security News
RubyGems.org has added a new "maintainer" role that allows for publishing new versions of gems. This new permission type is aimed at improving security for gem owners and the service overall.
Security News
Node.js will be enforcing stricter semver-major PR policies a month before major releases to enhance stability and ensure reliable release candidates.