Core Function SetBit

From Sputnik Wiki
Jump to: navigation, search
SetBit( <binary-array>, <index>, <value> )

Contents

Description

Set the bit at a given index.

Parameters

binary-array

The binary variable to use.

index

Index of the bit to set (This is not the index of the bytes).

value

Optional; Value to set the bit to. (Should be TRUE or FALSE)

Default: FALSE

Return Value

Success: Returns true if operation was a success (even if the bit was already set to what we wanted to change them to)

Failure: Returns false

Remarks

This is a very good way to store a ton of stuff inside bytes since you could store an array of about 8 individual true/false states in just 1 byte or an array of about 32 individual true/false states in just 4 bytes and so on.

This would use up an incredibly less amount of ram and processing power compared to using a dictionary directly.

See example to learn how to use this.

Example

Enum Privs
{
	$DeleteFile			= 0,
	$UploadFile			= 1,
	$DownloadFile			= 2,
	$RenameFile			= 3,
	$MoveFile			= 4,
	$CreateFolder			= 5,
	$DeleteFolder			= 6,
	$RenameFolder			= 7,
	$MoveFolder			= 8,
	$ReadChat			= 9,
	$SendChat			= 10,
	$CreateChat			= 11,
	$CloseChat			= 12
};
 
// Create a binary variable to hold the Bits
// It can be any size we want but for now 4 bytes
// is enough to hold the above privs
$Access = BinaryCreate(4, 0x00);
// Make sure all privs are off
FillBit($Access, false);
 
// Print privs to see default state
// (Should all be disabled)
say "--- Privs ---";
PrintPrivs($Access);
say; // Blank new line
 
// Lets add some Privs
SetBit($Access, Privs->$UploadFile, true);
SetBit($Access, Privs->$CreateFolder, true);
SetBit($Access, Privs->$ReadChat, true);
SetBit($Access, Privs->$CloseChat, true);
 
// Print privs again to see changes
say "--- Privs After Change ---";
say "(UploadFile, CreateFolder, ReadChat and CloseChat will be enabled)";
PrintPrivs($Access);
say; // Blank new line
 
// Lets add some Privs again
SetBit($Access, Privs->$SendChat, true);
// Print privs again to see changes
say "--- Privs After Change (1 added) ---";
say "(in addition to above SendChat will be enabled)";
PrintPrivs($Access);
say; // Blank new line
 
// Lets remove some Privs
SetBit($Access, Privs->$SendChat, false);
SetBit($Access, Privs->$CreateFolder, false);
// Print privs again to see changes
say "--- Privs After Change (2 removed) ---";
say "(SendChat and CreateFolder will be removed)";
PrintPrivs($Access);
say; // Blank new line
 
// Now lets just turn all privs on
FillBit($Access, true);
say "--- Privs After Change ---";
say "(All Enabled)";
PrintPrivs($Access);
say; // Blank new line
 
// Finally lets just turn all privs off
FillBit($Access, false);
say "--- Privs After Change ---";
say "(All Disabled)";
PrintPrivs($Access);
say; // Blank new line
 
// This function will print all the privs that
// are available to us every time its called
Function PrintPrivs( $data )
{
	my $Allowed = 0;
	foreach( Enumerate('Privs') as my $Key => my $Value )
	{
		my $Status = GetBit($data, $Value);
		if($Status) // Only show privs we can use
		{
			say "Priv '$Key' Access is '$Status'";
			$Allowed++;
		}
	}
	if(!$Allowed)
	{
		say "You have no privs";
	}
}
 
// Prints
//
// --- Privs ---
// You have no privs
//
// --- Privs After Change ---
// (UploadFile, CreateFolder, ReadChat and CloseChat will be enabled)
// Priv 'uploadfile' Access is 'true'
// Priv 'createfolder' Access is 'true'
// Priv 'readchat' Access is 'true'
// Priv 'closechat' Access is 'true'
//
// --- Privs After Change (1 added) ---
// (in addition to above SendChat will be enabled)
// Priv 'uploadfile' Access is 'true'
// Priv 'createfolder' Access is 'true'
// Priv 'readchat' Access is 'true'
// Priv 'sendchat' Access is 'true'
// Priv 'closechat' Access is 'true'
//
// --- Privs After Change (2 removed) ---
// (SendChat and CreateFolder will be removed)
// Priv 'uploadfile' Access is 'true'
// Priv 'readchat' Access is 'true'
// Priv 'closechat' Access is 'true'
//
// --- Privs After Change ---
// (All Enabled)
// Priv 'deletefile' Access is 'true'
// Priv 'uploadfile' Access is 'true'
// Priv 'downloadfile' Access is 'true'
// Priv 'renamefile' Access is 'true'
// Priv 'movefile' Access is 'true'
// Priv 'createfolder' Access is 'true'
// Priv 'deletefolder' Access is 'true'
// Priv 'renamefolder' Access is 'true'
// Priv 'movefolder' Access is 'true'
// Priv 'readchat' Access is 'true'
// Priv 'sendchat' Access is 'true'
// Priv 'createchat' Access is 'true'
// Priv 'closechat' Access is 'true'
//
// --- Privs After Change ---
// (All Disabled)
// You have no privs

If you are wondering how to do SetBit() using Sputnik code only and not using any __Bit() functions then here is how its done

Enum Privs
{
	$DeleteFile			= 0,
	$UploadFile			= 1,
	$DownloadFile			= 2,
	$RenameFile			= 3,
	$MoveFile			= 4,
	$CreateFolder			= 5,
	$DeleteFolder			= 6,
	$RenameFolder			= 7,
	$cat			= 8
};
 
 
$Access = BinaryCreate(1, 0x00);
FillBit($Access, false);
 
MySetBit($Access, Privs->$DownloadFile, true);
MySetBit($Access, Privs->$CreateFolder, true);
MySetBit($Access, Privs->$RenameFolder, true);
 
say "--- Privs (Enabled 3) ---";
PrintPrivs($Access);
say;
 
say "--- Privs (Enabled all) ---";
FillBit($Access, true);
PrintPrivs($Access);
say;
 
Function MySetBit( $data, $index, $value = false )
{
	if ($value)
		$data[$index >> 3] |= (byte)(1 << (7 - ($index & 7)));
	else
		$data[$index >> 3] &= (byte)(~(1 << (7 - ($index & 7))));
}
 
Function MyGetBit( $data, $index )
{
	return ($data[$index >> 3] >> (7 - ($index & 7))) & 1;
}
 
Function PrintPrivs( $data )
{
	my $Allowed = 0;
	foreach( Enumerate('Privs') as my $Key => my $Value )
	{
		my $Status = MyGetBit($data, $Value);
		if($Status) // Only show privs we can use
		{
			say "Priv '$Key' Access is '$Status'";
			$Allowed++;
		}
	}
	if(!$Allowed)
	{
		say "You have no privs";
	}
}
// --- Privs (Enabled 3) ---
// Priv 'downloadfile' Access is 'true'
// Priv 'createfolder' Access is 'true'
// Priv 'renamefolder' Access is 'true'
//
// --- Privs (Enabled all) ---
// Priv 'deletefile' Access is 'true'
// Priv 'uploadfile' Access is 'true'
// Priv 'downloadfile' Access is 'true'
// Priv 'renamefile' Access is 'true'
// Priv 'movefile' Access is 'true'
// Priv 'createfolder' Access is 'true'
// Priv 'deletefolder' Access is 'true'
// Priv 'renamefolder' Access is 'true'
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox