C 按位运算符的幂2模? 2的幂模如何仅对二进制数的低位(1011000111011010)起作用 这个数字是多少模2到幂0,2到幂4 2的幂和模算子有什么关系?它有特殊的财产吗 有人能给我举个例子吗
指导老师说:“当你把某物的mod取为2的幂时,你只取它的低阶位。”。我不敢问他是什么意思=)他的意思是:C 按位运算符的幂2模? 2的幂模如何仅对二进制数的低位(1011000111011010)起作用 这个数字是多少模2到幂0,2到幂4 2的幂和模算子有什么关系?它有特殊的财产吗 有人能给我举个例子吗,c,math,bit-manipulation,bitwise-operators,bitwise-and,C,Math,Bit Manipulation,Bitwise Operators,Bitwise And,指导老师说:“当你把某物的mod取为2的幂时,你只取它的低阶位。”。我不敢问他是什么意思=)他的意思是: x modulo y = (x & (y − 1)) 当y是2的幂时 例如: 0110010110 (406) modulo 0001000000 (64) = 0000010110 (22) ^^^^<- ignore these bits x = 10101010110101110 x mod 4 = 00000000000000010 01100110
x modulo y = (x & (y − 1))
当y是2的幂时
例如:
0110010110 (406) modulo
0001000000 (64) =
0000010110 (22)
^^^^<- ignore these bits
x = 10101010110101110
x mod 4 = 00000000000000010
01100110(406)模
0001000000 (64) =
0000010110 (22)
^^^^ 考虑一下,当你取一个模10的数时。如果你这样做,你只会得到数字的最后一位
334 % 10 = 4
12345 % 10 = 5
同样,如果你取一个模为100的数,你只得到最后两位数
334 % 100 = 34
12345 % 100 = 45
所以你可以通过查看二进制的最后几位,得到二次幂的模。这与按位and运算相同。模运算通常返回除法后值的剩余部分。例如,x mod 4
,根据x返回0、1、2或3。这些可能的值可以用二进制(00、01、10、11)中的两位来表示-另一种方法是将x中除最后两位之外的所有位设置为零
例如:
0110010110 (406) modulo
0001000000 (64) =
0000010110 (22)
^^^^<- ignore these bits
x = 10101010110101110
x mod 4 = 00000000000000010
他的意思是,取number mod 2^n
相当于除去n
数字的最低阶(最右边)位以外的所有位
例如,如果n==2
number number mod 4
00000001 00000001
00000010 00000010
00000011 00000011
00000100 00000000
00000101 00000001
00000110 00000010
00000111 00000011
00001000 00000000
00001001 00000001
etc.
因此,换句话说,number mod 4
与number&00000011
相同(其中&
表示按位和)
请注意,这在base-10中的作用完全相同:number mod 10
给出base-10中数字的最后一位,number mod 100
给出最后两位,等等。回答您的具体问题:
mod是一个余数运算符。如果应用于0,1,…,中的一系列数字x,那么x mod n将是0,1,…,n-1,0,1,…,n-1,无穷大。当模n是2的幂时,那么x模n将以二进制形式从0到n-1,再到0,再到n-1,等等;对于看起来像二进制01xxxxx的模n,x mod n将循环通过每个低阶位xxxxx
二进制1011000111011010模1是0(模2^0产生最后的零位;模1的所有内容都是零)。二进制1011000111011010模二进制10000为1010(模2^4产生最后四位)
二进制数的除法和余数除以二的幂特别有效,因为它只是移位和掩蔽;从数学上讲,这没什么特别的
示例:见问题2的答案
嘿,谢谢你的回复。我没有完全理解你的例子?2的幂也成立吗?54%32等于2^5等于22。波波:是的。末尾的位数由使用的二次幂决定。正如Cicada所描述的,您可以将其计算为54&(32-1)。为什么不尝试手动执行一些示例计算,然后您就会看到结果。只有当所有操作数都为正时,才会出现这种情况!根据语言的不同,行为会有所不同。例如,在C中,-5%4==-1
尽管在代数中我们通常期望-5 mod 4
是3(在C中:-5&(4-1)==3
。这意味着,例如,如果左操作数不是无符号的,编译器将不会使用&
优化文本%4
。@calandoa:我们在这里讨论的是二进制作为数字系统,而不是数字的位编码。-5
,例如,是编写的-101
@BlueRaja:当然我们在谈论位编码:&
不是为数学定义的-
。我想你的评论更像是“我们不是在谈论负数”。也许我们不是,但这在问题和答案中都不清楚,所以我说得更清楚了。你是不是在数字MOD 256
(数字和(0xFF00))>>8
(对于2^8=256)