Это немного больше, чем было задано, но это было то, что мне нужно, когда я нашел эту запись. Этот код предоставит мантиссе, базу и знак 32-битного поплавка IEEE 754.
import ctypes
def binRep(num):
binNum = bin(ctypes.c_uint.from_buffer(ctypes.c_float(num)).value)[2:]
print("bits: " + binNum.rjust(32,"0"))
mantissa = "1" + binNum[-23:]
print("sig (bin): " + mantissa.rjust(24))
mantInt = int(mantissa,2)/2**23
print("sig (float): " + str(mantInt))
base = int(binNum[-31:-23],2)-127
print("base:" + str(base))
sign = 1-2*("1"==binNum[-32:-31].rjust(1,"0"))
print("sign:" + str(sign))
print("recreate:" + str(sign*mantInt*(2**base)))
binRep(-0.75)
:
bits: 10111111010000000000000000000000
sig (bin): 110000000000000000000000
sig (float): 1.5
base:-1
sign:-1
recreate:-0.75
Как правило, то, когда реализация равняется Вам, может проверить, чтобы видеть, равен ли класс аргумента (или совместим) к классу с реализацией прежде, чем бросить его. Что-то вроде этого:
if (getClass() != obj.getClass())
return false;
MyObj myObj = (MyObj) obj;
Выполнение его этот путь предотвратит предупреждение FindBugs.
примечание стороны А для обращения к комментарию:
Некоторые люди требуют использовать instanceof
вместо getClass
для проверки безопасности типов. Существуют большие дебаты по этому, в которое я пытался не войти, когда я отметил, что можно проверить на равенство класса или совместимость, но я предполагаю, что не могу выйти из него. Это сводится к этому - если Вы используете instanceof
, можно поддерживать равенство между экземплярами класса и экземплярами его подкласса, но Вы рискуете нарушать симметричные условия контракта equals
. Обычно я рекомендовал бы не использовать instanceof
, если Вы не знаете о необходимости в нем, и Вы знаете то, что Вы делаете. Для получения дополнительной информации см.:
Вы, вероятно, делаете что-то вроде этого:
public class Foo {
// some code
public void equals(Object o) {
Foo other = (Foo) o;
// the real equals code
}
}
В этом примере Вы предполагаете, что что-то об аргументе равняется (): Вы предполагаете, что это имеет тип Foo. Это не должно иметь место! Можно также получить Строку (в этом случае, необходимо почти определенно возвратить false).
, Таким образом, Ваш код должен быть похожим на это:
public void equals(Object o) {
if (!(o instanceof Foo)) {
return false;
}
Foo other = (Foo) o;
// the real equals code
}
(или использование более строгое getClass() != o.getClass()
упомянутый Dave L.
Вы могли также посмотреть на него этот путь:
Integer i = new Integer(42);
String s = "fourtytwo";
boolean b = i.equals(s);
там какая-либо причина, что этот код должен бросить ClassCastException
вместо того, чтобы обычно закончиться и установка b
к false
?
Бросок ClassCastException
, поскольку ответ на .equals()
не был бы разумен. Поскольку, даже если это - глупый вопрос ("Конечно, Строка никогда не равна Нечто!"), это - все еще допустимое с превосходным ответом ("нет" == false
).
Я запускаю, мой равняется (Объектным) реализациям как это:
if ((object == null) || !(object instaceof ThisClass)) {
return false;
}
Это также предотвратит предупреждение FindBugs, но автоматически не возвратится false
, когда подкласс ThisClass будет вручен. Это можно было бы также считать равным, особенно если equals(Object)
метод hasn’t переопределенный.
Я бы рекомендовал игнорировать указанное предупреждение findbugs. На практике, если equals вызывается с объектом неожиданного класса, это почти наверняка ошибка, и вы хотите быстро потерпеть неудачу при обнаружении ошибок.
Например, если у вас есть 'ArrayList files' и вы вызываете files.contains («MyFile.txt»), было бы неплохо, если бы вы получили исключение ClassCastException. Вместо этого Java просто возвращает false, и, вероятно, потребуется много времени, пока вы не обнаружите эту ошибку.