C 需要一些位操作的错误识别吗

C 需要一些位操作的错误识别吗,c,bit-manipulation,bit-shift,C,Bit Manipulation,Bit Shift,问题是SegmentOFF。例如,如果调用SegmentON后DATA[18]=0x10,我想清除数据[18]的第6位。调用SegmentOFF清除所有位,并以DATA[18]=0x00结束 代码有什么问题 unsigned char DATA[24]; unsigned int Segment2BitMap[48] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0204,

问题是
SegmentOFF
。例如,如果调用
SegmentON
DATA[18]=0x10
,我想清除
数据[18]
的第6位。调用
SegmentOFF
清除所有位,并以
DATA[18]=0x00结束

代码有什么问题

unsigned char DATA[24];     
unsigned int Segment2BitMap[48] = 
{
    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
    0x0204, 0x0300, 0x0302, 0x0307, 0x0600, 0x0601, 0x0602, 0x0603,
    0x0604, 0x0605, 0x0606, 0x0607, 0x0804, 0x0900, 0x0902, 0x0907,
    0x0C00, 0x0C01, 0x0C02, 0x0C03, 0x0C04, 0x0C05, 0x0C06, 0x0C07,
    0x0E04, 0x0F00, 0x0F02, 0x0F07, 0x1200, 0x1201, 0x1202, 0x1203,
    0x1204, 0x1205, 0x1206, 0x1207, 0x1404, 0x1500, 0x1502, 0x1507    
};

void SegmentON(unsigned char Number)
   {
    unsigned int Data = Segment2BitMap[Number];
    unsigned char UpperByte = (Data/256); //upper byte
    unsigned char LowerByte = (Data%256 & 0x07); //lower byte
    DATA[UpperByte] |= (0x01<<LowerByte);
}

void SegmentOFF(unsigned char Number)
{
    unsigned int Data = Segment2BitMap[Number];
    unsigned char UpperByte = (Data/256); //upper byte
    unsigned char LowerByte = (Data%256 & 0x07); //lower byte
    DATA[UpperByte] &= (0x01<<LowerByte);
}

int main()
{
    SegmentON(40);
    SegmentOFF(42);
}
无符号字符数据[24];
无符号整数段2bitmap[48]=
{
0x0000、0x0001、0x0002、0x0003、0x0004、0x0005、0x0006、0x0007,
0x0204、0x0300、0x0302、0x0307、0x0600、0x0601、0x0602、0x0603,
0x0604、0x0605、0x0606、0x0607、0x0804、0x0900、0x0902、0x0907,
0x0C00、0x0C01、0x0C02、0x0C03、0x0C04、0x0C05、0x0C06、0x0C07,
0x0E04、0x0F00、0x0F02、0x0F07、0x1200、0x1201、0x1202、0x1203、,
0x1204、0x1205、0x1206、0x1207、0x1404、0x1500、0x1502、0x1507
};
void SegmentON(无符号字符数)
{
无符号整数数据=分段2BITMAP[编号];
无符号字符UpperByte=(Data/256);//上限字节
无符号字符LowerByte=(数据%256&0x07);//低位字节
数据[大写字节]|=(0x01
如果您想清除一个特定的位,而不应更改其余的位,则必须将其反转

对于8位:

var &= (1<<2)^0xFF
如果您想清除一个特定的位,而不应更改其余的位,则必须将其反转

对于8位:

var &= (1<<2)^0xFF

好的,我主要使用ruby,但是位运算符看起来是一样的。(因此我假设它们是一样的)

让我们使用一个随机数,比如201。二进制表示如下: 1100 1001

要打开一点,只需执行一个或操作


201 |=1好的,我主要使用ruby,但是位运算符看起来是一样的。(因此我假设它们是一样的)

让我们使用一个随机数,比如201。二进制表示如下: 1100 1001

要打开一点,只需执行一个或操作


201 |=1首先尝试在纸上完成。当你得到它时,就很容易在代码中实现它。在你的
SegmentOFF
函数中,你希望所有位都是
1
,除了你正在关闭的位。现在你只把一个位设置为
1
,所以你清除了所有其他位。只需在应用e位运算符,即
DATA[UpperByte]&=~(0x01与该错误无关,但是
/
%
非常难看和令人困惑。如果你用正常的方式来做,你会立即看到
数据&0xFF&7
数据&7
是一样的,所以你可以让它简单一点。试着先在纸上做。当你得到它的时候,它就很容易了o在代码中实现它。在
SegmentOFF
函数中,除了要关闭的位之外,您希望所有位都是
1
。现在您只将单个位设置为
1
,因此您清除了所有其他位。只需在应用按位和运算符之前反转该值,即
数据[UpperByte]&=~(0x01与该错误无关,但
/
%
非常难看且令人困惑。如果您按照正常方式操作,您会立即看到
数据&0xFF&7
数据&7
是相同的东西,因此您可以将其简化一点。
var = var & 0b11111011
if 209&(1<<2) != 0
  209 ^= 1<<2
end