Дополнение Two в Python

У меня самого был тот же вопрос, и этот вопрос побудил меня немного исследовать его,

Я создал следующий класс

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 будет аналогичный набор операций, происходящих и с перегруженным оператором +. Мысли?

58
задан erikbwork 23 October 2014 в 07:59
поделиться

3 ответа

>>> bits_in_word=12
>>> int('111111111111',2)-(1<<bits_in_word)
-1

Это работает, потому что:

Двойное дополнение двоичного файла число определяется как значение полученный вычитанием числа от большой степени двойки (в частности, от 2 ^ N для N-битного дополнение до двух). Двое дополнение числа тогда ведет себя как негатив оригинала число в большинстве арифметических операций, и это может сосуществуют с положительными числами в естественным путем.

8
ответ дан 24 November 2019 в 18:52
поделиться

Пара реализаций (просто иллюстрация, не предназначенная для использования):

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
3
ответ дан 24 November 2019 в 18:52
поделиться

Он не встроен, но если вам нужны числа необычной длины, вы можете использовать модуль 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
20
ответ дан 24 November 2019 в 18:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: