C语言问题,位运算,二进制

2024-11-29 10:46:32
推荐回答(2个)
回答1:

int bit_set(int *arg, int bit) { //这个函数置*arg右数置第bit位为1
if (bit<0 || bit>=(sizeof(int)*8))   //这里应是>=sizeof(int)*8)
return 0; 
*arg |= (1 << bit); 
return 1; } 

ii) int bit_clear(int *arg, int bit) {//此函数置*arg右数置第bit位为0
int mask; 
if (bit<0 || bit>=(sizeof(int)*8))     //这里应是>=sizeof(int)*8)
return 0; mask = ~(1 << bit) 
*arg &= mask;
return 1; }

iii) int bit_invert(int *arg, int bit) {//此函数将*arg右数第bit位0,1互换
int mask; 
if (bit<0 || bit>=(sizeof(int)*8))  //这里应是>=sizeof(int)*8)
return 0; 
mask = 1 << bit; *arg ^= mask; 
return 1; }

三个函数的返回值为0,表示bit超范围,操作失败。

返回1表示操作成功。

回答2:

第一个结果的确是1111,但用%D输出就是输出他的十进制数,所以输出的是15
第二个就不是1111了,而是32个1(假设INT点32位),因为向右移时,第一位(即符号位)是1,所以前面补的是1而不是0,所以是32个1,然后用%D输出其十进制数当然就是-1了
你可以改一下,看一下他的十六进制数就知道了,输出的时候用这个格式,printf("%X\n",c);