VS 如何将十进制数进行位判断??

位运算 VS 普通运算

其实我个人觉得没有什么可比性,这两种运算,要说它们属于不同领域也是可以的,位运算是位运算,普通运算是普通运算。 不过吧,位运算快一点,程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。 但是吧,数据量小的时候也看不出什么区别来,不过数据量大的话,嘿嘿,我也没试过。

多学点总是好的,技多不压身嘛。

相同位的两个数字都为1,则为1;若有一个不为1,则为0。

and运算通常用于二进制的取位操作。 小技巧:一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

更多技巧慢慢看,在后面。

相同位只要一个为1即为1。

or运算通常用于二进制特定位上的无条件赋值。 小技巧:一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

更多技巧慢慢看,在后面。

两个位相同为0,相异为1

^运算通常用于翻转指定位。 小技巧:将数 X= 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=,然后将X与Y进行异或运算(X^Y=)即可得到。

更多技巧慢慢看,在后面。

not运算的定义是把内存中的0和1全部取反。

使用按位取反运算符,要知道几点: 1、内存中,一个int,4个字节,1字节8位。 2、有符号整数的按位取反情况略有偏差。

小技巧:可以用~使每个数的最低位为0,方法:a & ~1

别问我上面为什么不用这么长,我也不知道。我猜,是我不想写这么长哈哈哈。

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

小技巧:若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

小技巧:操作数每右移一位,相当于该数除以2。

既然都讲到这里了,那自然要了解一下负数的表示形式了。

==用字节的最高位表bai示:“1"表示"正”,“0"表示"负” ==

1、把补码“取反”(把二进制数的各位“1”换“0”,“0”换“1”。比如“101010”取反后为“010101”) 2、把取反后的二进制数“加1”

示例:-17 转码 再转回来

挺秀的啊,不过有的人说这样会出问题,比方说 a = b 的时候。 那我再来分析一下:

哦,确实,他是对的。 都说是投机了,大家看着用吧,下面的其他投机技巧也说不定会是地雷哦。

只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数。

将正数变成负数,负数变成正数

整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数5. 位操作求绝对值整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 31 位得到 0,负数右移 31 位得到 -1,即 0xffffffff),然后根据符号进行相应的操作

上面的操作可以进行优化,可以将 i == 0 的条件判断语句去掉。我们都知道符号位 i 只有两种情况,即 i = 0 为正,i = -1 为负。对于任何数与 0 异或都会保持不变,与 -1 即 0xffffffff 进行异或就相当于对此数进行取反,因此可以将上面三目元算符转换为((a^i)-i),即整数时 a 与 0 异或得到本身,再减去 0,负数时与 0xffffffff 异或将 a 进行取反,然后在加上 1,即减去 i(i =-1)

统计二进制1的个数可以分别获取每个二进制位数,然后再统计其1的个数,此方法效率比较低。这里介绍另外一种高效的方法,同样以 34520 为例,我们计算其 a &= (a-1)的结果:

我们发现,没计算一次二进制中就少了一个 1,则我们可以通过下面方法去统计:count = 0

N如果是2的幂次,则N满足两个条件。

因为N的二进制表示中只有一个1,所以使用N & (N - 1)将N唯一的一个1消去,应该返回0。

因为只有一个数恰好出现一个,剩下的都出现过两次,所以只要将所有的数异或起来,就可以得到唯一的那个数。(异或自反性)

5、判断奇偶(取出最后一位) 等价于a%2(结果等于,位运算效率高) 10、在对应i+1位,插入b的对应位; 13、仅保留最后一-个1 15、保留最后i-1位 16、清零最后i-1位

以上,为最常见的用法,不带循环,全部O(1)。

初次见面,先打基础,待我这两天去LeetCode上包装一下。 待我包装完,试试看用位运算进行排序能不能写出来。

}


· 超过35用户采纳过TA的回答

说实话,我也没弄明白为什么要加‘0’,并且这里‘0’是ASCII中的48,也就是说C1/C2/C3的值都加48,而按照程序的意图,C1,C2,C3都应该是表示7进制中7的0,1,2次方上的权值,也就是C1、C2、C3都应该是个位数。这里加48是没道理的。

将'0'去掉后,使用VS2008编译,结果是正确的,截图如下:

另:楼下的回答说出了出现这种情况的原因,但是不适用于当前代码。

如果是要使用char c1,c2,c3;的话,代码要使用C,而不是C++,应该用

抱歉,最快回答是正确的。我试了一下他的代码然后又想了一下,的确是正确的。

这样进行转换与我想象中的转换思路有些出入。

程序末尾添加的cin >> c;是为了不让窗口退出。

}

我要回帖

更多关于 java判断数字位数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信