Ruby: XOR каждый символ в строке [дубликат]

Я пишу это для java, но, возможно, вы сочтете это полезным. Он использует longs вместо двухместных, но заботится о NaNs, subnormals и т. Д.

public static boolean equal(double a, double b) {
    final long fm = 0xFFFFFFFFFFFFFL;       // fraction mask
    final long sm = 0x8000000000000000L;    // sign mask
    final long cm = 0x8000000000000L;       // most significant decimal bit mask
    long c = Double.doubleToLongBits(a), d = Double.doubleToLongBits(b);        
    int ea = (int) (c >> 52 & 2047), eb = (int) (d >> 52 & 2047);
    if (ea == 2047 && (c & fm) != 0 || eb == 2047 && (d & fm) != 0) return false;   // NaN 
    if (c == d) return true;                            // identical - fast check
    if (ea == 0 && eb == 0) return true;                // ±0 or subnormals
    if ((c & sm) != (d & sm)) return false;             // different signs
    if (abs(ea - eb) > 1) return false;                 // b > 2*a or a > 2*b
    d <<= 12; c <<= 12;
    if (ea < eb) c = c >> 1 | sm;
    else if (ea > eb) d = d >> 1 | sm;
    c -= d;
    return c < 65536 && c > -65536;     // don't use abs(), because:
    // There is a posibility c=0x8000000000000000 which cannot be converted to positive
}
public static boolean zero(double a) { return (Double.doubleToLongBits(a) >> 52 & 2047) < 3; }

Имейте в виду, что после нескольких операций с плавающей запятой число может сильно отличаться от ожидаемого. Для этого не существует кода.

2
задан 8 December 2008 в 10:24
поделиться

2 ответа

В Ruby 1.8.7 или 1.9.1:

input.bytes.inject { |a,b| a ^ b }.to_s(16)
4
ответ дан Bkkbrad 21 August 2018 в 22:21
поделиться

Нашел его ...

lrc = 0
input.each_byte do | c |
    lrc ^= c
end
hexVal = lrc.to_s(16)
4
ответ дан user 21 August 2018 в 22:21
поделиться
Другие вопросы по тегам:

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