当前位置: 首页 > 知识库问答 >
问题:

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

乐正涵忍
2024-01-25

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

共有2个答案

西门良才
2024-01-25

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 都需要提前判断。

翟嘉志
2024-01-25

在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。
 类似资料:
  • 主要内容:按位与运算(&),按位或运算(|),按位异或运算(^),取反运算(~),左移运算(<<),右移运算(>>)所谓 位运算,就是对一个比特(Bit)位进行操作。在《 数据在内存中的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。 C语言提供了六种位运算符: 运算符 & | ^ ~ << >> 说明 按位与 按位或 按位异或 取反 左移 右移 按位与运算(&) 一个比特(Bit)位只有 0 和 1 两个取值,只有参与 运算的

  • 在 C 语言中,相同的数字可以用不同的数制来表示。也就是十进制的数字可以等价的表示为二进制或者十六进制。那么对于二进制来说,可以进行逐个数字之间,也就是每一个数字位的运算。这种运算也广泛的存在我们日程使用的数字电路中。其实计算机的运算原理最底层就是位运算,也就是 0 和 1 的运算。 1. 位运算符 运算符 作用 示例 & 位与 a&b | 位或 a|b ^ 位异或 a^b ~ 位非 ~b <<

  • 本文向大家介绍C语言位运算和sizeof运算符详解,包括了C语言位运算和sizeof运算符详解的使用技巧和注意事项,需要的朋友参考一下 位运算和sizeof运算符       C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。位运算主要有6种:与(&),或(|),取反(~),异或(^),左

  • 老师们好 下面的代码,我怎么想也没有想明白会返回-1 0|0 = 0, 0|1 =1, 1|1 =1, 1|0 = 1, 怎么会出现-1呢,

  • 需求:实现将数组中所有元素调整为左右两部分,左边为奇数,右边为偶数。(c语言) 中这段代码: 能不能换成一下这个? 想问问为什么可换/为什么不能换? 谢谢指导,菜鸟万分感激。

  • 主要内容:C语言程序的整体框架我们有两种方式从计算机获得信息:一是看屏幕上的文字、图片、视频等,二是听从喇叭发出来的声音。让喇叭发出声音目前还比较麻烦,我们先来看看如何在屏幕上显示一些文字吧。 在屏幕上显示文字非常简单,只需要一个语句,例如,下面的代码会让屏幕显示出“小牛知识库”: 这里有一个生疏的词汇 ,用来让计算机在屏幕上显示文字。 更加专业的称呼: "在屏幕上显示文字"叫做输出(Output); 每个文字都是一个字符(C