否定演算子を前に付けるだけで、適切なコンパイラはこのビット操作を実装します-a
。とにかく、あなたはビットをORしている。XORする必要があります。これは、私がテストしたコンパイラー(GCC、MSVC、CLang)が実行することです。だからあなた自身に賛成して書いてください-a
編集:Cは特定の浮動小数点形式を強制しないため、非整数のC変数に対するビット操作は、最終的には誤った動作を引き起こすことに注意してください。
コメントによる編集2:これはGCCがx86_64に対して発行する否定コードです
.globl neg
.type neg, @function
neg:
.LFB4:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movss %xmm0, -4(%rbp)
movss -4(%rbp), %xmm1
movss .LC0(%rip), %xmm0
xorps %xmm1, %xmm0 /* <----- Sign flip using XOR */
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE4:
.size neg, .-neg
xorps
特別な条件に注意して、フローティンポイント用に設計されたXORであることに注意してください。これはSSE命令です。