forked from EvilBeaver/OneScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGlobalBitFunctions.cs
More file actions
157 lines (144 loc) · 5.67 KB
/
GlobalBitFunctions.cs
File metadata and controls
157 lines (144 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using OneScript.Contexts;
using OneScript.Exceptions;
using ScriptEngine.Machine.Contexts;
namespace OneScript.StandardLibrary
{
/// <summary>
/// Глобальный контекст. Побитовые операции с целыми числами.
/// </summary>
[GlobalContext(Category="Побитовые операции с целыми числами")]
public sealed class GlobalBitFunctions : GlobalContextBase<GlobalBitFunctions>
{
/// <summary>
/// Выполняет побитовое И для заданных чисел.
/// </summary>
/// <param name="number1">Число 1</param>
/// <param name="number2">Число 2</param>
/// <returns>Число. Результат побитового И</returns>
[ContextMethod("ПобитовоеИ")]
public uint BitwiseAnd(uint number1, uint number2)
{
return number1 & number2;
}
/// <summary>
/// Выполняет побитовое Или для заданных чисел.
/// </summary>
/// <param name="number1">Число 1</param>
/// <param name="number2">Число 2</param>
/// <returns>Число. Результат побитового Или</returns>
[ContextMethod("ПобитовоеИли")]
public uint BitwiseOr(uint number1, uint number2)
{
return number1 | number2;
}
/// <summary>
/// Инвертирует биты числе.
/// </summary>
/// <param name="number1"></param>
/// <returns>Число</returns>
[ContextMethod("ПобитовоеНе")]
public uint BitwiseNot(uint number1)
{
return ~number1;
}
/// <summary>
/// Выполняет преобразование, эквивалентное <code>ПобитовоеИ(Число1, ПобитовоеНе(Число2))</code>
/// </summary>
/// <param name="number1">Число 1</param>
/// <param name="number2">Число 2</param>
/// <returns>Число. Результат преобразования</returns>
[ContextMethod("ПобитовоеИНе")]
public uint BitwiseAndNot(uint number1, uint number2)
{
return number1 & ~number2;
}
/// <summary>
/// Выполняет побитовое Исключительное Или для заданных чисел.
/// </summary>
/// <param name="number1">Число 1</param>
/// <param name="number2">Число 2</param>
/// <returns>Число. Результат побитового Исключительного Или</returns>
[ContextMethod("ПобитовоеИсключительноеИли")]
public uint BitwiseXor(uint number1, uint number2)
{
return number1 ^ number2;
}
/// <summary>
/// Получает значение заданного бита.
/// </summary>
/// <param name="value">Число</param>
/// <param name="bitNumber">Номер бита</param>
/// <returns>Булево. Истина - бит установлен в 1, Ложь - бит установлен в 0</returns>
[ContextMethod("ПроверитьБит")]
public bool CheckBit(uint value, int bitNumber)
{
return (value & (1 << bitNumber)) != 0;
}
/// <summary>
/// Устанавливает нужный бит числа в указанное значение
/// </summary>
/// <param name="value">Число</param>
/// <param name="bitNumber">Номер бита</param>
/// <param name="bitValue">Значение бита</param>
/// <returns>Число. Число с установленным в нужное значение битом</returns>
[ContextMethod("УстановитьБит")]
public uint SetBit(uint value, int bitNumber, int bitValue)
{
return bitValue == 0
? (value & ~(uint)(1 << bitNumber))
: (value | (uint)(1 << bitNumber));
}
/// <summary>
/// Проверяет соответствие числа битовой маске.
/// </summary>
/// <param name="value">Число</param>
/// <param name="mask">Маска</param>
/// <returns>Булево. Истина, когда в числе установлены в 1 все биты маски.
/// Ложь - в остальных случаях</returns>
[ContextMethod("ПроверитьПоБитовойМаске")]
public bool CheckByBitMask(uint value, uint mask)
{
return (value & mask) == mask;
}
/// <summary>
/// Выполняет побитовый сдвиг числа влево на заданное смещение
/// </summary>
/// <param name="value">Число</param>
/// <param name="offset">Смещение</param>
/// <returns></returns>
[ContextMethod("ПобитовыйСдвигВлево")]
public uint BitwiseShiftLeft(uint value, int offset)
{
if (offset < 0 || offset > 31)
{
throw RuntimeException.InvalidArgumentValue(offset);
}
return value << offset;
}
/// <summary>
/// Выполняет побитовый сдвиг числа вправо на заданное смещение
/// </summary>
/// <param name="value">Число</param>
/// <param name="offset">Смещение</param>
/// <returns></returns>
[ContextMethod("ПобитовыйСдвигВправо")]
public uint BitwiseShiftRight(uint value, int offset)
{
if (offset < 0 || offset > 31)
{
throw RuntimeException.InvalidArgumentValue(offset);
}
return value >> offset;
}
public static IAttachableContext CreateInstance()
{
return new GlobalBitFunctions();
}
}
}