如何找出一个数字是否为偶数
1076次观看(过去30天)
显示旧的注释
接受的答案
沃尔特·罗伯森
2012年10月23日
编辑:MathWorks支金宝app援小组
2018年11月9日
1评论
Dillen。一个
2020年2月5日
举个简单的例子:
A = [-2 -1 0 1 2 3 4 5 6];% A是你的值或矩阵
IS_EVEN = ~mod(A,2)
哪个是一样的
IS_EVEN = ~bitget(abs(A),1)
同样的
IS_EVEN = ~rem(A,2)
你可以使用
逻辑()
而不是
~
(isnot)用于ODD,如果你想要布尔值。也
bitget ()
不适用于负整数,因此
abs ()
.
不过,这是一个警告;只有
bitget ()
如果A中的元素不是整数,将抛出一个错误!其他的将为分数输出“奇数”。
除非你重复这个动作很多很多次,否则速度无关紧要。否则,你应该向量化。
更多答案(8)
Anmol辛格
2020年4月10日
编辑:Anmol辛格
2020年4月10日
给定的数字是偶数还是奇数,我们使用&运算符。
如果某个数是奇数,它的最右位必定是1。
例子:
int i = 5;
二进制形式i= 0101
现在使用&运算符
int j =我;[0101 & 1]/ /
这里有0001;
1评论
沃尔特·罗伯森
2020年4月10日
这在MATLAB中是行不通的。在MATLAB中,运算
c = A & B
等于
如果A ~= 0
如果B ~= 0
C = true;
其他的
C = false;
结束
elseifB ~= 0
C = false;
其他的
C = false;
结束
是的,这可以更有效,但这是对&操作符的建模。更有效的操作是&&
注意,这不是按位操作。5&1不是二进制0101 & 0001给出0001:而是(5~=0)和(1 ~=0)
与您正在讨论的内容等价的MATLAB是bitand()运算符
bitand(5、1)
但如果你要这么做,你还不如直接问最后一点:
bitget(5、1)%the 1是LSB为#1的位数
霍华德•林
2021年10月15日
编辑:沃尔特·罗伯森
2022年2月8日
testN = 10000000;
testvar = round(rand(testN,1)*testN);
抽搐
output1 =快速眼动(testvar, 2);
toc
抽搐
Output2 =floor(testvar/2) ~= testvar/2;
toc
抽搐
output3 = bitget (testvar, 1) = = 1;
toc
抽搐
Output4 =(-1)。^testvar == -1;
toc
上面生成输出
> > testisoddspeed
运行时间是0.101100秒。
运行时间是0.010721秒。
运行时间是0.054311秒。
运行时间是0.040362秒。
编辑:在AMD Ryzen 5800H 2018b上测试。更新了变量已经是整数的情况下的答案,这样就不必先强制转换了。
testN = 10000000;
testvar = round(rand(testN,1)*testN);
抽搐
Output1 =floor(testvar/2) ~= testvar/2;
toc
Testvar = uint32(Testvar);
抽搐
output2 =快速眼动(testvar 2) = = 1;
toc
抽搐
output3 = bitget (testvar, 1) = = 1;
toc
抽搐
Output4 =(-1)。^testvar == -1;
toc
结果
> > testisoddspeed
运行时间是0.014634秒。
运行时间是0.123930秒。
运行时间是0.013089秒。
运行时间是0.032953秒。
Bitget可以稍微快一点。
11日评论
沃尔特·罗伯森
2021年10月28日
这是我使用的代码:
流(“1 \ n”);
小牛();
流(“2 \ n”);
小牛();
流(“3 \ n”);
小牛();
函数小牛();
testN = 10000000;
testvar = round(rand(testN,1)*testN);
抽搐
output1 = mod (testvar, 2);
toc
抽搐
Output2 =floor(testvar/2) ~= testvar/2;
toc
抽搐
output3 = bitget (uint32 (testvar), 1);
toc
抽搐
Output4 =(-1)。^testvar == -1;
toc
结束