Tag: 按位运算符

仅使用按位运算在C中实现更大的等号

我知道许多基本操作(如加法或除法)也可以仅使用按位运算符在C中实现。 如何使用大于或等号(> =)来做同样的事情? if (x >= 0) { … }

C – 对模数的按位运算的算法,对于非2的幂次数

我知道可以使用按位运算符计算2的幂的模数 x % 2^n == x & (2^n – 1). 但我想知道是否存在任何通用的按位算法来查找任何数的模数不是2的幂。例如, 7%5 先感谢您。

按位运算仍然可行吗?

维基百科,一个真正的知识来源,指出: 在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,并且通常比乘法和除法运算快得多。 在现代体系结构中,情况并非如此:按位运算通常与添加速度相同(尽管仍然比乘法更快)。 是否有一个实际的理由来学习按位操作黑客,或者它现在只是你学习理论和好奇心的东西?

关于小端和大端的按位非运算符(〜在C中)

这与家庭作业有关,但这不是家庭作业。 我很难理解,如果在大端机器和小端机器上编译时,按位不是( ~在C中)会如何影响signed int和unsigned int 。 字节是否真的 “向后”,如果是,那么按位(和其他运算符)是否会导致根据机器类型产生不同的结果? 虽然我们在这里,对于C中的每个按位运算符,答案是否相同,还是它依赖于它? 我所指的运营商是: ~ /* bitwise Not */ & /* bitwise And */ | /* bitwise Or */ ^ /* bitwise Exclusive-Or */ 先感谢您! 更新:到目前为止,在阅读我的回复时,我觉得有必要问一下bitwise not运算符是否会影响signed int上的符号位。 因为我忘了这一切,所以我担心这部分有点困惑。 亚当似乎在说所有的价值都被视为无符号。 是重新应用符号位还是一次签名的值变为无符号?

如何使用按位运算符返回0或1

我的函数接受32位int,如果该数字在任何偶数位置都有1,我需要返回0或1。 我不能使用任何条件语句我也一次只能访问8位。 以下是输入示例:10001000 01011101 00000000 11001110 1)用AA(10101010)移动位和它们并将每个位存储在一个变量中。 int a = 10001000 int b = 1000 int c = 0 int d = 10001010 现在,如果没有设置奇数位,我需要返回0,如果有,则需要返回1。 我们可以看到有。 所以我需要将这些组合成一个数字,然后使用!! 操作员返回0或1.这是我遇到麻烦的地方。 int valueToReturn = a | b | c | d; 现在我需要说: return !!valueTOReturn; 它不是回报正确的价值任何人都可以给我任何洞察力??? 我不能使用任何条件语句,如|| && 我想到了。 我说的所有内容都给出了正确答案,但我抓住了其中一个变量的错误值。 感谢您的帮助!

使用按位运算符的条件语句

所以我看到这个问题已经被提出,但答案有点模糊,无益。 好的,我只需要使用“&^〜!+ | >> <<”来实现ac表达式 表达式需要类似:a? b:c 所以,从我能够讲述的,表达式需要看起来像: return (a & b) | (~a & c) 当a = 0时,这是有效的,因为用b进行和将得到零,然后或表达式将返回右侧, (~a & c) ,因为~0给出所有1,并且使用所有1返回c返回c 。 但是,当a> 0时,这不起作用。有人可以尝试解释为什么会这样,或者如何解决它?

在没有条件语句的情况下访问第n位

所以我有一点顺序: 1010 1是MSB。 如果奇数位为0,我的函数需要返回0的整数,如果是1,则返回1。 我不能使用任何for循环或任何性质的东西来看我是否需要返回0或1.有没有人有任何建议如何去做。 我正在考虑使用not操作,但我可以弄清楚如何使用它。 到目前为止,我正在使用1010 … 10的序列,然后将它连接起来。 这样做会让我得到1010.现在我需要找出是否返回1或0。

位移是否会自动将字符提升为int?

我在某处读到按位移位会自动将操作数转换为int。 但是我不确定该语句是否应该用“如果操作数是不相等的类型”来限定。 char one = 1, bitsInType = 8; one << (bitsInType – one); 第二行的默认结果是否导致int或char?

Bitwise Leftshift(<<)奇怪的行为

gcc bitwise Leftshift( << )奇怪的行为。 这是我的代码: #include #include void foo(int n){ printf(“1<<32:%d\n", 1<<32); printf("1<<(32-n):%d\n", 1<<(32-n)); } int main(){ foo(0); } 如果我将0作为参数传递,结果可能会有所不同。 编译源代码: $gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 main.c: In function ‘foo’: main.c:5:3: warning: left shift count >= width of type [enabled by default] 执行程序: $demo 1<<32:0 1<<(32-n):1 这个结果是我从编译在线网站得到的 如果我将0传递给它,如何使foo函数输出0? (目前输出1代替)

填写可变数量的

使用未知(在编译时)的数量填充变量的最佳方法是什么? 例如,让我们说: int n = 5; int b = fillwithones(5); 现在b包含11111(二进制)。 我不能只是硬编码int b = 31因为n未提前知道(在我的应用程序中)。 我可以这样做: int b = pow(2, n) – 1 但使用战俘似乎非常浪费。 谢谢!