Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在没有~运算符的情况下设置和清除位_C_Math_Embedded - Fatal编程技术网

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

C 如何在没有~运算符的情况下设置和清除位,c,math,embedded,C,Math,Embedded,我正在为Bluegiga芯片使用一个类似C的脚本,他们的脚本语言在编译器中没有~操作符。 有没有办法用纯数学来处理比特? 例如,我读取一个字节,需要清除位1并设置位2 支持以下按位操作: 操作符号 及& 或| 异或^ 左移> 支持以下数学运算符: 操作符号 补充:+ 减法:- 乘法:* 分部:/ 少于:< 小于或等于: 大于或等于:>= 等于:= 不等于:= 对-1执行异或运算将反转整数中的所有位。只需使用OR和运算。要执行该操作,请执行以下操作: 初始字节:0000 0001 清除位1:000

我正在为Bluegiga芯片使用一个类似C的脚本,他们的脚本语言在编译器中没有
~
操作符。 有没有办法用纯数学来处理比特? 例如,我读取一个字节,需要清除位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)