想问一下一个C语言的位运算小问题.
有没有一个简单的表达式的写法,可以得到一个32位无符号数,只保留其最左侧或者最右侧的1的结果?
比如35=(000..0100011),得到32或者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 都需要提前判断。
在C语言中,可以使用按位与运算符(&)和按位右移运算符(>>)来得到一个32位无符号数的最左侧或最右侧的1。
要得到最左侧的1,可以使用如下表达式:
num & -num
要得到最右侧的1,可以使用如下表达式:
num & (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语言) 中这段代码: 能不能换成一下这个? 想问问为什么可换/为什么不能换? 谢谢指导,菜鸟万分感激。
主要内容:位域的存储,无名位域有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的 数据结构。 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。请看下面的例子: 后面的数字用来限定成员变量占用的位数。成员 m 没有限制,根据数据类型即可推算出它占