У меня самого был тот же вопрос, и этот вопрос побудил меня немного исследовать его,
Я создал следующий класс
public class Class1
{
string str = "One" + "Team";
string str2 = string.Concat("One", "Team");
}
. Ниже приведен соответствующий код IL для тот.
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 40 (0x28)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "OneTeam"
IL_0006: stfld string StringConcat.Class1::str
IL_000b: ldarg.0
IL_000c: ldstr "One"
IL_0011: ldstr "Team"
IL_0016: call string [mscorlib]System.String::Concat(string, string)
IL_001b: stfld string StringConcat.Class1::str2
IL_0020: ldarg.0
IL_0021: call instance void [mscorlib]System.Object::.ctor()
IL_0026: nop
IL_0027: ret
// end of method Class1::.ctor
}
Для меня определенно похоже, что string.Concat
имеет больше шагов, чем перегруженный оператор +. Но я точно знаю, что внутри класса System.String
будет аналогичный набор операций, происходящих и с перегруженным оператором +. Мысли?
>>> bits_in_word=12
>>> int('111111111111',2)-(1<<bits_in_word)
-1
Это работает, потому что:
Двойное дополнение двоичного файла число определяется как значение полученный вычитанием числа от большой степени двойки (в частности, от 2 ^ N для N-битного дополнение до двух). Двое дополнение числа тогда ведет себя как негатив оригинала число в большинстве арифметических операций, и это может сосуществуют с положительными числами в естественным путем.
Пара реализаций (просто иллюстрация, не предназначенная для использования):
def to_int(bin):
x = int(bin, 2)
if bin[0] == '1': # "sign bit", big-endian
x -= 2**len(bin)
return x
def to_int(bin): # from definition
n = 0
for i, b in enumerate(reversed(bin)):
if b == '1':
if i != (len(bin)-1):
n += 2**i
else: # MSB
n -= 2**i
return n
Он не встроен, но если вам нужны числа необычной длины, вы можете использовать модуль bitstring .
>>> from bitstring import Bits
>>> a = Bits(bin='111111111111')
>>> a.int
-1
Один и тот же объект может быть эквивалентно создан несколькими способами, включая
>>> b = Bits(int=-1, length=12)
Он просто ведет себя как строка битов произвольной длины и использует свойства для получения различных интерпретаций:
>>> print a.int, a.uint, a.bin, a.hex, a.oct
-1 4095 111111111111 fff 7777