我正在为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: !=
答案 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将反转整数中的所有位。