如何在没有〜运算符的情况下设置和清除位

时间:2014-02-15 23:23:53

标签: c math embedded

我正在为Bluegiga芯片使用类似C的脚本,他们的脚本语言编译器中没有~运算符。 有没有办法使用纯数学的位? 例如,我读取一个字节,我需要清除第1位并设置第2位。

The following bitwise operations are supported:
Operation              Symbol
 AND                     &
 OR                      |
 XOR                     ^
 Shift left              <<
 Shift right             >>

The following mathematical operators are supported:
Operation              Symbol
 Addition:               +
 Subtraction:            -
 Multiplication:         *
 Division:               /
 Less than:              <
 Less than or equal:     <=
 Greater than:           >
 Greater than or equal:  >=
 Equals:                 =
 Not equals:             !=

4 个答案:

答案 0 :(得分:2)

只需使用OR和AND操作即可。要做这个操作:

初始字节:0000 0001

清除位1:0000 0001&amp; 1111 1110 - &gt;结果 - 0000 0000(第二个操作数的第1位必须为0才能清除该位)

现在设置位2:0000 0000 | 0000 0010 - &gt;结果 - 0000 0010(第二个操作数的第2位必须为1才能设置该位)

请注意,对于此操作,您只需更改具有相同值的所有其他位的特定位。

同样要获得第二个操作数,你可以通过以下方式获得它: 对于n位的置位操作 - 第二个操作数是2 ^ n

对n位的清除操作 - 第二个操作数是1111 1111 XOR 2 ^ n(在这种情况下,1111 1111 XOR用于非操作)。

答案 1 :(得分:1)

如果您错过了~运算符,则可以使用XOR和常量来创建自己的运算符。

#include<stdio.h>

int main()
{
    unsigned int s = 0xFFFFFFFF ;

    printf("%#x" , 0xFF ^ s ) ;  //XOR with the constant is equivalent to ~


    unsigned int byte = 0x4 ;
    printf("%#x" , 0x5 & ( byte ^ s ) ) ; //clear those bits

return 0 ;
}

当你有~时,很容易清除这些位。

答案 2 :(得分:1)

清除(单个)位也等同于INVERT(或xor)后面的SET。因此。

 aabbccdd  <-- original value
 00000110   OR                
 00000010  XOR
 --------
 aabbc10d  <-- result (I'm counting the bits from 7 downto 0)

这种方法的好处是可以从字节到本机整数大小进行扩展,而无需为AND操作计算掩码的负担。

答案 3 :(得分:0)

对-1执行XOR将反转整数中的所有位。