How to set and clear different bits with a single line of code (C)

前端 未结 2 775
不思量自难忘°
不思量自难忘° 2021-01-22 07:19

data |= (1 << 3) sets bit (3) without disrupting other bits. data &= ~(1 << 4) resets bit (4) without disrupting other bits. How can I

相关标签:
2条回答
  • 2021-01-22 07:39

    You can't.

    That is, if you want to explicitly ensure bx set and by clear - if you just want to flip them (regardless of prior value), you can XOR with operator^ as others have pointed out.

    To see why this can't be done in one instruction (of course, you can easily combine two or more instructions into a single LOC), consider the following truth table:

    B|A|Q
    -----
    0|0|x
    0|1|0
    1|0|1
    1|1|x
    

    where the "don't care" xs are irrelevant to discussion. No logical operator has this function - how could it? How can we determine which is B and which is A if the two inputs are of differing value*? That's at the heart of your problem.

    However, consider that cramming this into one instruction perhaps doesn't achieve your stated readability aim anyway. In fact if anything, the two separately is more readable - and can still be invoked by some set3clear4().


    NB - and this is way off on a tangent - that truth table can be implemented by so-called 'Logic Elements' in FPGA architectures, as they're constructed from 'look-up tables' (LUTs) essentially ROM where the inputs A,B,... index into the table to find the value Q. And of course, A¬B corresponds to an address different to ¬AB.

    0 讨论(0)
  • 2021-01-22 07:52

    It's not possible in a single instruction. This is because there are 3 possible operations you need to do on the different bits:

    • Set them (bit 3)
    • Clear them (bit 4)
    • Leave them alone (all the other bits)

    How can you select from one of three possibilities with a bitmask made up of binary digits?

    Of course, you can do it with one line e.g:

    data = (data | (1 << 3)) & ~(1 << 4)
    
    0 讨论(0)
提交回复
热议问题