为什么这个班次插入1s?C
我正在尝试创建一个32位二进制文件,除了srt之外,所有0的结尾都是1。所以如果srt是2,end是7,那么我会得到0000000000000000000111100。当我进行第二次移位时,它会给出更多的1,而不是0,我不知道为什么。非常了解C和位操作,如果有人能解释我将非常感激为什么这个班次插入1s?C,c,bit,bit-shift,C,Bit,Bit Shift,我正在尝试创建一个32位二进制文件,除了srt之外,所有0的结尾都是1。所以如果srt是2,end是7,那么我会得到0000000000000000000111100。当我进行第二次移位时,它会给出更多的1,而不是0,我不知道为什么。非常了解C和位操作,如果有人能解释我将非常感激 int groupOne(int srt, int end){ int mask =-1; int ret; ret = 1<<end; ret=ret<<srt
int groupOne(int srt, int end){
int mask =-1;
int ret;
ret = 1<<end;
ret=ret<<srt;
ret = mask+ret;
return ret;
}
intgroupone(intsrt,intend){
整数掩码=-1;
int ret;
ret=1来自C委员会草案(N1570):
6.5.7位移位运算符
…
语义
3对每个操作数执行整数提升。结果的类型为
提升后的左操作数的值。如果右操作数的值为负或为
大于或等于提升的左操作数的宽度,行为未定义
4E1>E2
的结果是E1
右移E2
位位置。如果E1
具有无符号类型
或者,如果E1
具有有符号类型和非负值,则结果值是E1/2E2
(2次方E2)商的整数部分。如果E1
具有有符号类型和负值,则结果值由实现定义
2的补码?start
将是一个比srt
更具信息性的参数名称@Kingsley:我同意名称的更改,除了示例似乎显示7个1位,其中第2位的值的有效性最低-因此编号为00000001 111111 00
(写入16位而不是32位)。因此,srt
的更好名称可能是len
或num_bits
或类似的名称。是的,对无符号
值执行所有按位操作要容易得多。