BitVecFlip

Table of Contents

BitVecFlip

Description

Flip the value of bit at given index in bitvector. Changes 0 to 1 and 1 to 0.

Parameters

NameDirectionDescription
bvinBitvector to flip bit in
idxinIndex of bit to flip (0-based)

Usage example (from documentation)

  BitVecFlip(&flags, 5);

Usage example (Cross-references)

    }
    
    void BitVecFlip(BitVec *bitvec, u64 idx) {
    ValidateBitVec(bitvec);
    if (idx >= bitvec->length) {
    // Test BitVecFlip function
    bool test_bitvec_flip(void) {
    printf("Testing BitVecFlip\n");
    
    BitVec bv = BitVecInit();
    
    // Flip some bits
    BitVecFlip(&bv, 0);
    BitVecFlip(&bv, 1);
    // Flip some bits
    BitVecFlip(&bv, 0);
    BitVecFlip(&bv, 1);
    
    // Test the flipped bits
    // Edge case tests for BitVecFlip
    bool test_bitvec_flip_edge_cases(void) {
    printf("Testing BitVecFlip edge cases\n");
    
    BitVec bv = BitVecInit();
    // Test flipping single bit
    BitVecPush(&bv, false);
    BitVecFlip(&bv, 0);
    bool result = (BitVecGet(&bv, 0) == true);
    
    // Flip it again
    BitVecFlip(&bv, 0);
    result = result && (BitVecGet(&bv, 0) == false);
    
    // Flip some bits and verify
    BitVecFlip(&bv, 1); // F -> T
    BitVecFlip(&bv, 3); // F -> T
    // Flip some bits and verify
    BitVecFlip(&bv, 1); // F -> T
    BitVecFlip(&bv, 3); // F -> T
    
    result = result && (BitVecCountOnes(&bv) == 5);
    
    // Flip some bits and verify
    BitVecFlip(&bv, 0);   // T -> F
    BitVecFlip(&bv, 1);   // F -> T
    BitVecFlip(&bv, 500); // T -> F
    // Flip some bits and verify
    BitVecFlip(&bv, 0);   // T -> F
    BitVecFlip(&bv, 1);   // F -> T
    BitVecFlip(&bv, 500); // T -> F
    BitVecFlip(&bv, 999); // F -> T
    BitVecFlip(&bv, 0);   // T -> F
    BitVecFlip(&bv, 1);   // F -> T
    BitVecFlip(&bv, 500); // T -> F
    BitVecFlip(&bv, 999); // F -> T
    BitVecFlip(&bv, 1);   // F -> T
    BitVecFlip(&bv, 500); // T -> F
    BitVecFlip(&bv, 999); // F -> T
    
    result = result && (BitVecCountOnes(&bv) == 500);
    // Flip every 7th bit
    for (int i = 0; i < size; i += 7) {
    BitVecFlip(&bv, i);
    }
    
    // Test NULL bitvec pointer - should abort
    BitVecFlip(NULL, 0);
    
    return false;
    
    // Test flip on empty bitvec - should abort
    BitVecFlip(&bv, 0);
    
    BitVecDeinit(&bv);
    
    // Test with index exactly at length (invalid) - should abort
    BitVecFlip(&bv, 10);
    
    BitVecDeinit(&bv);
    // Test BitVecFlip function
    bool test_bitvec_flip(void) {
    printf("Testing BitVecFlip\n");
    
    BitVec bv = BitVecInit();
    
    // Flip each bit
    BitVecFlip(&bv, 0); // 1 -> 0
    BitVecFlip(&bv, 1); // 0 -> 1
    BitVecFlip(&bv, 2); // 1 -> 0
    // Flip each bit
    BitVecFlip(&bv, 0); // 1 -> 0
    BitVecFlip(&bv, 1); // 0 -> 1
    BitVecFlip(&bv, 2); // 1 -> 0
    BitVecFlip(&bv, 0); // 1 -> 0
    BitVecFlip(&bv, 1); // 0 -> 1
    BitVecFlip(&bv, 2); // 1 -> 0
    
    // Verify flipped values: should now be 010
    
    // Flip back
    BitVecFlip(&bv, 0); // 0 -> 1
    BitVecFlip(&bv, 1); // 1 -> 0
    BitVecFlip(&bv, 2); // 0 -> 1
    // Flip back
    BitVecFlip(&bv, 0); // 0 -> 1
    BitVecFlip(&bv, 1); // 1 -> 0
    BitVecFlip(&bv, 2); // 0 -> 1
    BitVecFlip(&bv, 0); // 0 -> 1
    BitVecFlip(&bv, 1); // 1 -> 0
    BitVecFlip(&bv, 2); // 0 -> 1
    
    // Should be back to original: 101
    
    bool test_bitvec_flip_edge_cases(void) {
    printf("Testing BitVecFlip edge cases\n");
    
    BitVec bv     = BitVecInit();
    // Test normal flipping
    BitVecPush(&bv, true);
    BitVecFlip(&bv, 0);
    result = result && (BitVecGet(&bv, 0) == false);
    result = result && (BitVecGet(&bv, 0) == false);
    
    BitVecFlip(&bv, 0);
    result = result && (BitVecGet(&bv, 0) == true);
    if (boundaries[i] < size) {
    bool original = BitVecGet(&bv, boundaries[i]);
    BitVecFlip(&bv, boundaries[i]);
    result = result && (BitVecGet(&bv, boundaries[i]) == !original);
    BitVecFlip(&bv, boundaries[i]); // Flip back
    BitVecFlip(&bv, boundaries[i]);
    result = result && (BitVecGet(&bv, boundaries[i]) == !original);
    BitVecFlip(&bv, boundaries[i]); // Flip back
    result = result && (BitVecGet(&bv, boundaries[i]) == original);
    }
    
    // Test NULL bitvec pointer - should abort
    BitVecFlip(NULL, 0);
    
    return false;
    
    // Test flip on empty bitvec - should abort
    BitVecFlip(&bv, 0);
    
    BitVecDeinit(&bv);
    
    // Test with index exactly at length (invalid) - should abort
    BitVecFlip(&bv, 10);
    
    BitVecDeinit(&bv);

Share :

Related Posts

BitVecReserve

BitVecReserve Description Reserve space for at least n bits in bitvector. Does not change the length, only ensures capacity.

Read More

BitVecResize

BitVecResize Description Reu64 bitvector to hold exactly n bits. May grow or shrink the bitvector.

Read More

BitVecClear

BitVecClear Description Clear all bits in bitvector without deallocating memory. Sets length to 0 but keeps allocated capacity.

Read More