二进制数以及位运算
二进制数的一些特性
1、如果一个二进制数(整型)数的第零位的值是一,那么这个数就是奇数;而如果该位是零,那么这个数就是偶数。
2、如果一个二进制数的低端n位都是零,那么这个数可以被2n整除。
3、如果一个二进制数的第n位是一,而其他各位都是零,那么这个数等于2n。
4、如果一个二进制数的第零位到第n位(但不包含位n)都是一,而且其他各位都是零,那么这个数等于2n-1。
5、将一个二进制数的所有位左移移位的结果是将该数乘以二。
6、将一个无符号二进制数的所有位右移一位的结果等效于该数除以二(这对有符号数不适用)。余数会被下舍入(round down)
7、将两个n位的二进制数相成可能会需要2*n位来保存结果。
8、将两个n位的二进制数相加或者相减绝不会需要多于n+1位来保存结果。
9、将一个二进制数的所有位取反(就是将所有的一改为零,所有的零改为一)等效于将该数取负(改变符号)再将结果减一。
10、将任意给定个数的位表示的最大无符号二进制数加一的结果永远是零。
11、零递减(减一)的结果永远是某个给定个数的位表示的最大无符号二进制数。
12、n位可以表示2n个不同的组合。
13、数2年包含n位,所有位都是一。
有用的位运算
可以使用逐位与(and)运算来检测位串中的各个位是零还是一。例如:IsOdd = (ValueToTest & 1) != 0;
可以使用与运算来检测一组位是零/非零。例如IsDivisibleBy16 = (ValueToTest & 0xF) == 0;比较一个位串中的一组特定的位。(可能不连续)。
使用逻辑与创建模-n计数器(Modulo-n Counters)
cntr = (cntr + 1) & 0x3f; // 0x3f = 31. 这里实现的就是模-32计数器


留下 您的足印