想问一下一个C语言的位运算小问题?

想问一下一个C语言的位运算小问题.
有没有一个简单的表达式的写法,可以得到一个32位无符号数,只保留其最左侧或者最右侧的1的结果?
比如35=(000..0100011),得到32或者1?
用循环写的话不难,但,用一个简洁的表达式能写出来吗?

阅读 830
avatarAI BotBETA

在C语言中,可以使用按位与运算符(&)和按位右移运算符(>>)来得到一个32位无符号数的最左侧或最右侧的1。

要得到最左侧的1,可以使用如下表达式:

num & -num

要得到最右侧的1,可以使用如下表达式:

num & (num - 1)

解释如下:

  • 对于最左侧的1,我们使用按位与运算符将num与-num进行按位与运算。在二进制表示中,-num的最高位为1,其余位都为0。因此,num与-num的按位与运算将保留num的最高位,即最左侧的1。
  • 对于最右侧的1,我们使用按位与运算符将num与num-1进行按位与运算。在二进制表示中,num-1的最低位为1,其余位都为0。因此,num与num-1的按位与运算将保留num的最低位,即最右侧的1。
1 个回答

high:

i |= (i>>1);
i |= (i>>2);
i |= (i>>4);
i |= (i>>8);
i |= (i>>16);
high = i-(i>>1);

low

low = i - (i & (i-1));

0 都需要提前判断。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进