设置一下后打印变量

时间:2015-08-14 18:09:24

标签: c bit-manipulation

我试图在8位变量中设置一个位。 每次在设置特定位后打印变量时,我总是将值设为1。

uint8 value;
value = (1<<1 || value)
printf(%x \n,value); //prints 1 instead of 2
value = (1<<2 || value)
printf(%x \n,value); //prints 1 instead of 4

2 个答案:

答案 0 :(得分:8)

你正在使用布尔'或'||。按位'或'是|

此外,您还没有初始化value,因此您不能指望它是什么。

答案 1 :(得分:0)

不,你不这样做。

要将OR设置为1。

例如,将OR的最低有效位设置为1。

即:

 unsigned char val = 4;
 // set bit 0
 val |= 1;
 printf("Value now: %x\n", val);

设置第1位:

 unsigned char val = 4;
 // set bit 1
 val |= 1 << 1;
 printf("Value now: %x\n", val);

一个完整的例子

#include <stdio.h>

char* get_binary(unsigned char buffer, char* binary) {
    for (int i = 0; i < 8; ++i) {
        int bit = (buffer >> i) & 1;
        binary[7 - i] = bit ? '1' : '0';
    }
    return binary;
}


int main() {

    unsigned char val = 4;  // val now 100
    int bits_to_shift;
    unsigned char buffer[10] = { 0 };
    unsigned char* p = buffer;
    // set bit 0
    val |= 1;  
    printf("Value now: %x, binary=%s\n", val, get_binary(val, p));  // val now 5 :- 101

    // To set bit 1 (ie set so we have 111), shift to position then OR

    // set bit 1
    bits_to_shift = 1;
    val |= 1 << bits_to_shift;
    printf("Value now: %x, binary=%s\n", val, get_binary(val, p));  // val now 7 :- 111 

    // set bit 3
    bits_to_shift = 3;
    val |= 1 << bits_to_shift;
    printf("Value now: %x, binary=%s\n", val, get_binary(val, p));  // val now F :- 1111
}