C 如何在没有~运算符的情况下设置和清除位
我正在为Bluegiga芯片使用一个类似C的脚本,他们的脚本语言在编译器中没有C 如何在没有~运算符的情况下设置和清除位,c,math,embedded,C,Math,Embedded,我正在为Bluegiga芯片使用一个类似C的脚本,他们的脚本语言在编译器中没有~操作符。 有没有办法用纯数学来处理比特? 例如,我读取一个字节,需要清除位1并设置位2 支持以下按位操作: 操作符号 及& 或| 异或^ 左移> 支持以下数学运算符: 操作符号 补充:+ 减法:- 乘法:* 分部:/ 少于:< 小于或等于: 大于或等于:>= 等于:= 不等于:= 对-1执行异或运算将反转整数中的所有位。只需使用OR和运算。要执行该操作,请执行以下操作: 初始字节:0000 0001 清除位1:000
~
操作符。
有没有办法用纯数学来处理比特?
例如,我读取一个字节,需要清除位1并设置位2
支持以下按位操作:
操作符号
及&
或|
异或^
左移>
支持以下数学运算符:
操作符号
补充:+
减法:-
乘法:*
分部:/
少于:<
小于或等于:
大于或等于:>=
等于:=
不等于:=
对-1执行异或运算将反转整数中的所有位。只需使用OR和运算。要执行该操作,请执行以下操作:
初始字节:0000 0001
清除位1:0000 0001&1111 1110-->结果-0000 0000(第二个操作数的第一位必须为0才能清除该位)
现在设置位2:0000 0000 | 0000 0010-->结果-0000 0010(第二个操作数的2st位必须为1才能设置该位)
请注意,对于此操作,您仅更改特定位,其他所有位保留相同的值
此外,要获取第二个操作数,只需通过以下方式获取:
对于n位上的set运算,第二个操作数为2^n
对于n位上的清除操作,第二个操作数为1111111 XOR 2^n(在本例中,1111111 XOR用于not操作)。如果缺少
~
运算符,可以使用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 ;
}
#包括
int main()
{
无符号整数s=0xFFFFFFFF;
printf(“%#x”,0xFF^s);//XOR与常量相等~
无符号整数字节=0x4;
printf(“%#x”,0x5&(字节^s));//清除这些位
返回0;
}
当您有~
时,清除位是很容易的。清除一个(单个)位也相当于通过反转(或异或)进行设置。因此
aabbccdd不幸的是,它会影响字节中的其他位。是的,在此版本中,清除1位不会影响其他位。在2的补码中:-x=~x+1
=>~x=-x-1=-(x+1)
;不过,XOR答案显然更有效。
aabbccdd <-- original value
00000110 OR
00000010 XOR
--------
aabbc10d <-- result (I'm counting the bits from 7 downto 0)