3 ms·
Can you post examples in other languages where this would be easier?
by vlovich123 2y ago
Can you post examples in other languages where this would be easier?
- IshKebab 2y agoSure, in Rust: fn sign_extend_u11(x: u32) -> u32 { (((x as i32) << (32-11)) >> (32-11)) as u32 } Doesn't have any of the C++ issues he mentions. And it will be faster than the alternative since it's just two instructions. (Ok this is never going to matter in practice but still...)
- dan-robertson 2y agoIsn’t the alternative also two instructions: x ^ 0x400 - 0x400
- TinkersW 2y agoShifts run on less ports than xor/sub, so should be avoided if possible when performance is important, especially when using SIMD where the shifts are often quite subpar.
- vlovich123 2y agoBut the C++20 code doesn't have this issue. That's my point. C++20 is 4 years old by this point.
- samatman 2y agoZig: fn signExtend(raw: u11) i32 { return @as(i11, @bitCast(raw)); } test "signExtend" { try expectEqual(1023, signExtend(1023)); try expectEqual(-1, signExtend(2047)); }
- nayuki 2y agoThe first piece of code is perfect in Java: int t = (val_11b << (32 - 11)) >> (32 - 11).