双符号位有四种情况,分为00,01,10,11,那么双符号位补码向右移位时,如何补0或者补1呢?

以00.1101 11.1101 01.1101 10.1101为例

1.符号位的补码移码,无论左移还是右移,数符不变,空位补零。

1.0111右移一位是1.1011; 1.0011左移一位是1.0110

2.符号位的补码移码:

在移位过程中,双符号位的第一位看做实际数符,确定数值正负,始终不变;

双符号位的第二位,看做数值的一部分,随着小数点后的数值一起移位,向右移位时,作为补0或者补1位。

1)正数补码移位。数符不变,空位补0

00.1101左移一位是01.1010,右移一位是00.0110; 01.1101左移一位是01.1010,右移一位是00.1110

2)负数补码移位,规则是左移空位补0,右移空位补1

11.1101左移一位是11.1010,右移一位是11.1110; 10.1101左移一位是11.1010,右移一位是11.0110

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
所有的整数类型以二进制数字的变化及其宽度来表示。例如,byte 型值42的二进制代码是00101010 ,其中每个置在此代表2的次方,在最右边的以20开始。向左下一个置将是21,或2,依次向左是22,或4,然后是8,16,32等等,依此类推。因此42在其置1,3,5的值为1(从右边以0开始数);这样42是21+23+25的和,也即是2+8+32 。 所有的整数类型(除了char 类型之外)都是有符号的整数。这意味着他们既能表示正数,又能表示负数。Java 使用大家知道的2的补码(two's complement )这种编码来表示负数,也就是通过将与其对应的正数的二进制代码取反(即将1变成0,将0变成1),然后对其结果加1。例如,-42就是通过将42的二进制代码的各个取反,即对00101010 取反得到11010101 ,然后再加1,得到11010110 ,即-42 。要对一个负数解码,首先对其所有的取反,然后加1。例如-42,或11010110 取反后为00101001 ,或41,然后加1,这样就得到了42。 如果考虑到零的交叉(zero crossing )问题,你就容易理解Java (以及其他绝大多数语言)这样用2的补码的原因。假定byte 类型的值零用00000000 代表。它的补码是仅仅将它的每一取反,即生成11111111 ,它代表负零。但问题是负零在整数数学中是无效的。为了解决负零的问题,在使用2的补码代表负数的值时,对其值加1。即负零11111111 加1后为100000000 。但这样使1太靠左而不适合返回到byte 类型的值,因此人们规定,-0和0的表示方法一样,-1的解码为11111111 。尽管我们在这个例子使用了byte 类型的值,但同样的基本的原则也适用于所有Java 的整数类型。 因为Java 使用2的补码来存储负数,并且因为Java 中的所有整数都是有符号的,这样应用运算符可以容易地达到意想不到的结果。例如,不管你如何打算,Java 用高来代表负数。为避免这个讨厌的意外,请记住不管高的顺序如何,它决定一个整数的符号。 二 逻辑运算符 逻辑运算符有“与”(AND)、“或”(OR)、“异或(XOR )”、“非(NOT)”,分别用“&”、“|”、“^”、“~”表示,4-3 表显示了每个逻辑运算的结果。在继续讨论之前,请记住运算符应用于每个运算数内的每个单独的。 表4-3 逻辑运算符的结果 A 0 1 0 1 B 0 0 1 1 A | B 0 1 1 1 A & B 0 0 0 1 A ^ B 0 1 1 0 ~A 1 0 1 0 按非(NOT) 按非也叫做,一元运算符NOT“~”是对其运算数的每一取反。例如,数字42,它的二进制代码为: 00101010 经过按非运算成为 11010101与(AND) 按与运算符“&”,如果两个运算数都是1,则结果为1。其他情况下,结果均为零。看下面的例子: 00101010 42 &00001111 15 00001010 10或(OR) 按或运算符“|”,任何一个运算数为1,则结果为1。如下面的例子所示: 00101010 42 | 00001111 15 00101111 47 按异或(XOR) 按异或运算符“^”,只有在两个比较的不同时其结果是 1。否则,结果是零。下面的例子显示了“^”运算符的效果。这个例子也表明了XOR 运算符的一个有用的属性。注意第二个运算数有数字1的,42对应二进制代码的对应是如何被转换的。第二个运算数有数字0的,第一个运算数对应的数字不变。当对某些类型进行运算时,你将会看到这个属性的用处。 00101010 42 ^ 00001111 15 00100101 37 逻辑运算符的应用 下面的例子说明了逻辑运算符: // Demonstrate the bitwise logical operators. class BitLogic { public static void main(String args[]) { String binary[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; int a = 3; // 0 + 2 + 1 or 0011 in binary int b = 6; // 4 + 2 + 0 or 0110 in binary int c = a | b; int d = a & b; int e = a ^ b; int f = (~a & b) | (a & ~b); int g = ~a & 0x0f; System.out.println(" a = " + binary[a]); System.out.println(" b = " + binary[b]); System.out.println(" a|b = " + binary[c]); System.out.println(" a&b = " + binary[d]); System.out.println(" a^b = " + binary[e]); System.out.println("~a&b|a&~b = " + binary[f]); System.out.println(" ~a = " + binary[g]); } } 在本例中,变量a与b对应的组合代表了二进制数所有的 4 种组合模式:0-0,0-1,1-0 ,和1-1 。“|”运算符和“&”运算符分别对变量a与b各个对应的运算得到了变量c和变量d的值。对变量e和f的赋值说明了“^”运算符的功能。字符串数组binary 代表了0到15 对应的二进制的值。在本例中,数组各元素的排列顺序显示了变量对应值的二进制代码。数组之所以这样构造是因为变量的值n对应的二进制代码可以被正确的存储在数组对应元素binary[n] 中。例如变量a的值为3,则它的二进制代码对应地存储在数组元素binary[3] 中。~a的值与数字0x0f (对应二进制为0000 1111 )进行按与运算的目的是减小~a的值,保证变量g的结果小于16。因此该程序的运行结果可以用数组binary 对应的元素来表示。该程序的输出如下: a = 0011 b = 0110 a|b = 0111 a&b = 0010 a^b = 0101 ~a&b|a&~b = 0101 ~a = 1100 三 左移运算符 左移运算符<<使指定值的所有都左移规定的次数。它的通用格式如下所示: value << num 这里,num 指定要移值value 移动的数。也就是,左移运算符<<使指定值的所有都左移num。每左移一个,高阶都被移出(并且丢弃),并用0填充右边。这意味着当左移的运算数是int 类型时,每移动1它的第31就要被移出并且丢弃;当左移的运算数是long 类型时,每移动1它的第63就要被移出并且丢弃。 在对byte 和short类型的值进行移运算时,你必须小心。因为你知道Java 在对表达式求值时,将自动把这些类型扩大为 int 型,而且,表达式的值也是int 型。对byte 和short类型的值进行移运算的结果是int 型,而且如果左移不超过31,原来对应各的值也不会丢弃。但是,如果你对一个负的byte 或者short类型的值进行移运算,它被扩大为int 型后,它的符号也被扩展。这样,整数值结果的高就会被1填充。因此,为了得到正确的结果,你就要舍弃得到结果的高。这样做的最简单办法是将结果转换为byte 型。下面的程序说明了这一点: // Left shifting a byte value. class ByteShift { public static void main(String args[]) { byte a = 64, b; int i; i = a << 2; b = (byte) (a << 2); System.out.println("Original value of a: " + a); System.out.println("i and b: " + i + " " + b); } } 该程序产生的输出下所示: Original value of a: 64 i and b: 256 0 因变量a在赋值表达式中,故被扩大为int 型,64(0100 0000 )被左移两次生成值256 (10000 0000 )被赋给变量i。然而,经过左移后,变量b中惟一的1被移出,低全部成了0,因此b的值也变成了0。 既然每次左移都可以使原来的操作数翻倍,程序员们经常使用这个办法来进行快速的2 的乘法。但是你要小心,如果你将1移进高阶(31或63),那么该值将变为负值。下面的程序说明了这一点: // Left shifting as a quick way to multiply by 2. class MultByTwo { public static void main(String args[]) { int i; int num = 0xFFFFFFE; for(i=0; i<4; i++) { num = num << 1; System.out.println(num); } } 这里,num 指定要移值value 移动的数。也就是,左移运算符<<使指定值的所有都左移num。每左移一个,高阶都被移出(并且丢弃),并用0填充右边。这意味着当左移的运算数是int 类型时,每移动1它的第31就要被移出并且丢弃;当左移的运算数是long 类型时,每移动1它的第63就要被移出并且丢弃。 在对byte 和short类型的值进行移运算时,你必须小心。因为你知道Java 在对表达式求值时,将自动把这些类型扩大为 int 型,而且,表达式的值也是int 型。对byte 和short类型的值进行移运算的结果是int 型,而且如果左移不超过31,原来对应各的值也不会丢弃。但是,如果你对一个负的byte 或者short类型的值进行移运算,它被扩大为int 型后,它的符号也被扩展。这样,整数值结果的高就会被1填充。因此,为了得到正确的结果,你就要舍弃得到结果的高。这样做的最简单办法是将结果转换为byte 型。下面的程序说明了这一点: // Left shifting a byte value. class ByteShift { public static void main(String args[]) { byte a = 64, b; int i; i = a << 2; b = (byte) (a << 2); System.out.println("Original value of a: " + a); System.out.println("i and b: " + i + " " + b); } } 该程序产生的输出下所示: Original value of a: 64 i and b: 256 0 因变量a在赋值表达式中,故被扩大为int 型,64(0100 0000 )被左移两次生成值256 (10000 0000 )被赋给变量i。然而,经过左移后,变量b中惟一的1被移出,低全部成了0,因此b的值也变成了0。 既然每次左移都可以使原来的操作数翻倍,程序员们经常使用这个办法来进行快速的2 的乘法。但是你要小心,如果你将1移进高阶(31或63),那么该值将变为负值。下面的程序说明了这一点: // Left shifting as a quick way to multiply by 2. class MultByTwo { public static void main(String args[]) { int i; int num = 0xFFFFFFE; for(i=0; i<4; i++) { num = num << 1; System.out.println(num); } } } 该程序的输出如下所示: 536870908 1073741816 2147483632 -32 初值经过仔细选择,以便在左移 4 后,它会产生-32。正如你看到的,当1被移进31 位时,数字被解释为负值。 四 右移运算符 右移运算符>>使指定值的所有右移规定的次数。它的通用格式如下所示: value >> num 这里,num 指定要移值value 移动的数。也就是,右移运算符>>使指定值的所有右移num。下面的程序片段将值32右移2次,将结果8赋给变量a: int a = 32; a = a >> 2; // a now contains 8 当值中的某些被“移出”时,这些的值将丢弃。例如,下面的程序片段将35右移2 次,它的2个低被移出丢弃,也将结果8赋给变量a: int a = 35; a = a >> 2; // a still contains 8 用二进制表示该过程可以更清楚地看到程序的运行过程: 00100011 35 >> 2 00001000 8 将值每右移一次,就相当于将该值除以2并且舍弃了余数。你可以利用这个特点将一个整数进行快速的2的除法。当然,你一定要确保你不会将该数原有的任何一移出。 右移时,被移走的最高(最左边的)由原来最高的数字充。例如,如果要移走的值为负数,每一次右移都在左边1,如果要移走的值为正数,每一次右移都在左边0,这叫做符号扩展(保留符号)(sign extension ),在进行右移操作时用来保持负数的符号。例如,–8 >> 1 是–4,用二进制表示如下: 11111000 –8 >>1 11111100 –4 一个要注意的有趣问题是,由于符号扩展(保留符号)每次都会在高1,因此-1右移的结果总是–1。有时你不希望在右移时保留符号。例如,下面的例子将一个byte 型的值转换为用十六 进制表示。注意右移后的值与0x0f进行按与运算,这样可以舍弃任何的符号扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。 // Masking sign extension. class HexByte { static public void main(String args[]) { char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'' }; byte b = (byte) 0xf1; System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);}} 该程序的输出如下: b = 0xf1 五 无符号右移 正如上面刚刚看到的,每一次右移,>>运算符总是自动地用它的先前最高的内容它的最高。这样做保留了原值的符号。但有时这并不是我们想要的。例如,如果你进行移操作的运算数不是数字值,你就不希望进行符号扩展(保留符号)。当你处理像素值或图形时,这种情况是相当普遍的。在这种情况下,不管运算数的初值是什么,你希望移后总是在高(最左边)0。这就是人们所说的无符号移动(unsigned shift )。这时你可以使用Java 的无符号右移运算符>>> ,它总是在左边0。 下面的程序段说明了无符号右移运算符>>> 。在本例中,变量a被赋值为-1,用二进制表示就是32全是1。这个值然后被无符号右移24,当然它忽略了符号扩展,在它的左边总是0。这样得到的值255被赋给变量a。 int a = -1; a = a >>> 24; 下面用二进制形式进一步说明该操作: 11111111 11111111 11111111 11111111 int型-1的二进制代码>>> 24 无符号右移2400000000 00000000 00000000 11111111 int型255的二进制代码 由于无符号右移运算符>>> 只是对32和64的值有意义,所以它并不像你想象的那样有用。因为你要记住,在表达式中过小的值总是被自动扩大为int 型。这意味着符号扩展和移动总是发生在32而不是8或16。这样,对第7以0开始的byte 型的值进行无符号移动是不可能的,因为在实际移动运算时,是对扩大后的32值进行操作。下面的例子说明了这一点: // Unsigned shifting a byte value. class ByteUShift { static public void main(String args[]) { int b = 2; int c = 3; a |= 4; b >>= 1; c <<= 1; a ^= c; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); } } 该程序的输出如下所示: a = 3 b = 1 c = 6 还不清楚,移运算有多大的用处,可是面试时经常会考。现在重温一下子。 原文地址:(http://www.ddvip.net/program/java/index1/28.htm)
专为程序员打造的计算器,二进制运算强大,支持64。 采用表达式驱动,输入表达式便即时显示结果,抛弃传统计算器繁琐的按钮,表达式可粘贴或回调重复使用。 支持二进制串直接运算,如0b1101 & 0b0011= 0b0001。 支持与、或、非、异或、移(循环、逻辑、算术),直接读写二进制,指定段读、写、置1、清0、反转。 二进制数据表达方式多样,数据可以K、M、G等单为后缀。 支持类C语言库函数调用。 结果可以各种进制、各种单输出。 运算结果可存放在变量中。 内置常用生活函数。 总之,此计算器相当于解释执行的C语言表达式,但用起来更方便、更高效。 使用前请仔细阅读窗口内的帮助,便可成为开发工作中的好帮手。 [程序员二进制计算器 v1.36 帮助] 一 用法 在底部框中输入要计算的表达式,会即时显示计算结果,当无结果时说明表达式输入有误。 按回车键保存该次输入、清空输入框,并显示详细结果,包括可能有的错误信息。 在底部框中按键盘上、下箭头,可以调出历史输入。 当光标在结果框内时,按回车或TAB键可使光标跳至输入框。 二 特点 即时计算。 便捷的历史回调、复制、粘贴功能。 支持64整型运算,整数有效范围为 -9223372036854775808 至 9223372036854774784。 三 数的表示 1-整型数表示法 如何表示二、八、十六进制整数: (1)二进制数 以0b或0B开头,后面的0、1数字之间可以用空格分隔。 0b1001 = 9 0b 1001 0110 = 0x96 = 150 0B1001 0110% = 150% = 1.5 (2)八进制数 以0开头: 010 = 8 027 + 7 = 23 + 7 = 30 (3)十六进制数 以0x或0X开头: 0x10 = 16 -0XabEF * 2 = -44015 * 2 = -88030 2-浮点数表示法 (1)小数点前后的省略表示 3.14 3. = 3.0 .14 = 0.14 (2)用科学计数法表示浮点数 3e2 = 300 3e+2 = 300 3e-2 = 0.03 3.e2 = 300 3.e+2 = 300 3.14e-2 = 0.0314 .14e+2 = 14 3-字符型表示法 支持字符常量,字符型自动转换为整型(值为该字符的ASCII码),支持C/C++转义字符。 如何得到字符的ASCII码: 'a' = 97 'A' = 65 'a' + 3 = 100 'a' - 'A' = 32 '\''=39 '\"' = '"' = 34 '\? = '?' = 63 '\\' = 92 '\a' = 7 '\b' = 8 '\f' = 12 '\n' = 10 '\r' = 13 '\t' = 9 '\v' = 11 4-量词后缀表示 一个数的后面,可以跟有倍率运算符,表示该数乘以相应的倍数,例如: 2w = 20000 (2万) 13y = 1300000000 (13亿) 4k = 4096 3% = 0.03 (百分之3) 详见“倍率运算”部分。 三 运算结果的输出格式 1-指定方法 格式: [格式前缀] 表达式 表达式前面可带有“格式前缀”(可选的),用来指定运算结果的输出格式。 “格式前缀”与C/C++的printf函数基本相同,但不支持%s或%S。 当省略格式前缀时,默认按%g方式输出。此时对较小的数按原样输出,较大的数按科学计数法输出。 2-整型的输出格式 当按二、八、十六进制输出时,是按其补码形式输出,最高符号(正数为0、负数为1)。 所以此法可得到一个负数的补码表示。 (1)按二进制输出 %b或%B %b等价与%B。 %b 12 = 0b1100 %b 0xffffffff = 0b1111 1111 1111 1111 1111 1111 1111 1111 (2)按八进制输出 %o或%O %o等价与%O。 %o 10 = 012 (3)按十进制输出 %d 对于整型值,默认按十进制输出,此时%d可省略。 %d 123456789 = 123456789 (4)按十六进制输出 %x或%X 用%x时,字母abcdef输出为小写,用%X时,字母abcdef输出为大写。 %x 31 = 0x1f %X 31 = 0X1F (5)输出前的类型转换 对于浮点型值,用以上4种格式时,会先取整,再输出,因此它们可起到对结果取整的作用。 %d 12345.6789 = 12345 %d -12345.6789 = -12345 3-浮点型的输出格式 (1)按精简方式输出 %g %g是默认的输出格式(可省略),此时不输出无意义的0,当数较大时自动按科学计数法输出。 %g 314 = 314 %g 3.14000 = 3.14 %g 3.14 * 2 = 6.28 %g 1234567 = 1.23457e+006 (2)按全部数输出 %f %f输出全部,包括多余的0: %f 3.14 * 2 = 6.280000 (3)如何指定小数点后保留数 %m.nf 格式:%m.nf 其中,m和n都是整数,m指定总数,n指定小数点后保留几,如果m或n不足,则按实际数输出。 例1:指定小数点后保留2,其余四舍五入: %.2f 3.14159 = 3.14 例2:指定全部5,且小数点后保留3,其余四舍五入: %5.3f 3.14159 = 3.142 4-字符型的输出格式 %c或%C 如何得到ASCII值对应的字符(ASCII值转换为字符): 用%c,使结果(仅支持整型值)按字符形式输出即可。 %c 65 = 'A' %C 100-3 = 'a' 5-智能大小输出格式 用于将一个较大或较小的、不易读的数,自动转换为易读的单输出。 (1)以K、M、G、T、P、E为单输出 %sz %sz对结果按1024为单换算,用于快速计算磁盘文件的大小(sz是size的简写): 当结果=1K且=1M且=1G且=1T且=1P且=1E时,以E为单输出,例如: %sz 10000000000000000000 = 8.673617E (2)以W(万)、Y(亿)、WY(万亿)、YY(亿亿)、WYY(万亿亿)、YYY(亿亿亿)为单输出 %num %num对结果以万、亿等为单输出,用于便捷得到一个大数的值,格式符合中国人的习惯: 当结果=1万且=1亿且=1万亿且=1亿亿且=1万亿亿且=1亿亿亿时,以亿亿亿为单输出,例如: 围棋盘第1格放1粒米,以后每格放前一格2倍的米,一共需要多少粒米: %num 2**(18*18) = 3.41758e+073YYY (3)以kilo(千)、mil(百万)、bil(十亿)、tril(万亿)为单输出 %val %val对结果按1000为倍率单输出,用于便捷得到一个大数的值: 当结果=1千且=1百万且=十亿且=1万亿时,以万亿为单输出,例如: %val 519322y = 51.9322tril (2012年国内生产总值,y是后缀运算符,表示前值乘以1亿) 6-固定比例输出格式 (1)按百分比输出 %2 %2将结果按百分比格式输出,例如: 对150种食品进行抽查,仅105种合格,合格率是多少: %2 105/150 = 70% (2)按万分比输出 %4 %4将结果按万分比格式输出,例如: %4 0.00314 = 31.4%% 四 运算符与函数 1-运算符与分类 所有运算符,一律不区分大小写。 (1)一元运算符 只有1个操作数的运算符。 如果操作数是一个常数,它不需要用括号括起,并且与运算符之间不需要空格分隔,如: sqr2 = 1.41421 cos0 = 1 当操作数是表达式时,需要用括号括起,以划分优先级: sqr(1 + 2) = 1.73205 当操作数是一个内置常量时,它与运算符之间要有空格分隔: cos pi = -1 对少数一元运算符,按书写习惯放在了操作数的后面,如阶乘!和百分比% 3! = 6 3% = 0.03 (2)二元运算符 需要2个操作数的运算符,如+ - * /。 (3)三元运算符 需要3个操作数的运算符,如条件运算符 ?: 。 2-内置函数 调用格式:函数名(参数1, 参数2, ...) 其中,所有函数名不区分大小写。 函数名后是用一对括号括起的参数列表,各参数间用逗号分隔。 每个参数可以是一个数值,也可以是复杂表达式。 参数个数必须符合该函数的定义,部分函数支持无穷多个参数(sum, ave, max, min)。 整个函数调用又是个表达式(值为函数的返回值),又可以参与构成其它表达式。 五 基本运算 1-四则运算 (1)加 + 3 + 2 = 5 (2)减 - 3 - 2 = 1 (3)乘 * 3 * 2 = 6 (4)除 / 除数不能为0。 3 / 2 = 1.5 (5)求余 mod 除数不能为0,支持对浮点数求余。 5 mod 3 = 2 5.2 mod 3.1 = 2.1 6.28 mod 1.5 = 0.28 2-等比运算 格式为 a : b = c : ? 整个表达式的值为“使等式成立的问号处”的值。这里冒号的含义等于除号。 例子:商场里100元的衣服,打折后卖75元, 则另一件150元的衣服,同样打折后卖多少? 写出表达式 100:75=150:?,结果为112.5 3-取整 (1)下取整 floor 返回不大于x的最大整数: floor2.8 = 2 floor-2.8 = -3 (2)上取整 ceil 返回不小于x的最小整数: ceil2.8 = 3 ceil-2.8 = -2 4-求绝对值 abs abs-3.14 = 3.14 abs(3 - 5) = 2 5-求阶乘 ! 操作数不能小于0,或大于100。 3! = 6 (3!)! = 6! = 720 6-倍率运算 一个表达式的后面,可以跟有倍率运算符,表示该表达式的值乘以相应的倍数。 此法在表示一个大数或特定数时,可以减少书写量。 (1)存储单后缀运算符 K M G T P E 4k = (480/120)k = 4*1024 = 4096 2m = (2k)k = 2*1024*1024 = 2097152 4g = (2+2)g = 4*1024*1024*1024 = 4294967296 1t = 1024*1024*1024*1024 = 1099511627776 1p = 1024*1024*1024*1024*1024 = 1125899906842624 1e = 1024*1024*1024*1024*1024*1024 = 1152921504606847000 (2)数量后缀运算符一 w y wy yy wyy yyy 2w = 20000 (万) 13y = 1300000000 (亿) 1wy = (1w)y = 10000y = 1e+012 (万亿) 1yy = (1y)y = 1e+016 (亿亿) 1wyy = ( (1w) y )y = 1e+020 (万亿亿) 1yyy = ( (1y) y )y = 1e+024 (亿亿亿) (3)数量后缀运算符二 kilo mil bil tril 11.034kilo = 11.034 * 1000 = 11034 (千) 1.392mil = 1.392 * 100w = 1392000 (百万) 1.35382bil = 1.35382 * 10y = 1353821000 (十亿) 51.9322tril = 51.9322wy = 5.19322e+013 (万亿) (4)比率后缀运算符 % %% 求百分比 % 3% = 0.03 (500%)% = 5% = 0.05 500% mod 3 = 5 mod 3 = 2 求万分比 %% 12345%% = (12345%)% = 123.45% = 1.2345 7-幂运算、指数运算 (1)求平方根 sqr sqr2 = 1.41421 sqr(1 + 2) = 1.73205 (2)求X的Y次方 ** 幂运算,支持浮点数: 4 ** 3 = 4 * 4 * 4 = 64 2.5 ** 1.5 = 3.95285 (3)求e的x次方 exp exp1.5 = e ** 1.5 = 4.48169 8-对数运算 (1)求以2为底的对数 lg lg2 = 1, lg(2 * 2 * 2) = 3 (2)求以10为底的对数 ln ln10 = 1 ln(10 * 10) = 2 (3)求以e为底的对数 log log e = 1 log(e * e) = 2 9-取负 - -3.14 * -(1+2) = -3.14 * -3 = 9.42 5--3 = 5 - (-3) = 5 + 3 = 8 5--(-3) = 5 - (-(-3)) = 5 - 3 = 2 六 二进制运算 1-与 & 0b1111 & 0b1001 = 15 & 9 = 0b1001 = 9 2-或 | 0b1100 | 0b0011 = 12 | 3 = 0b1111 = 15 3-取反 ~ ~( -2 ) = ~ 0b1111 1111 1111 1111 1111 1111 1111 1110 = 1 (32版本) ~( -2 ) = ~ 0b1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110 = 1 (64版本) 4-异或 ^ 0b1111 ^ 0b1001 = 15 ^ 9 = 0b0110 = 6 5-移运算 (1)左移 << 0b0001 << 2 = 1 <> 0b1100 >> 2 = 12 >> 2 = 0b0011 = 3 注:这里是采用逻辑右移还是算术右移,由系统决定。 如果确定做逻辑右移,请用下面的rshl运算符;确定做算术右移,请用下面的rsha运算符。 (3)循环左移 rol 格式:data rol n 功能:返回整型值data循环左移n后的结果。 例子:%x 0x80000000 rol 2 = 0x2 (32版本) %x 0x8000000000000000 rol 2 = 0x2 (64版本) (4)循环右移 ror 格式:data ror n 功能:返回整型值data逻辑循环右移n后的结果。 例子:%x 0xf ror 8 = 0x0f000000 (32版本) %x 0xf ror 8 = 0x0f00000000000000 (64版本) (5)逻辑右移 rshl 格式:data rshl n 功能:无论当前系统采用何种形式的右移,返回整型值data逻辑右移n后的结果。 逻辑右移是指,当右移n位时,高n0(不考虑符号)。 例子:%x 0xf0000000 rshl 4 = 0x0f000000 (6)算术右移 rsha 格式:data rsha n 功能:无论当前系统采用何种形式的右移,返回整型值data算术右移n后的结果。 算术右移是指,如果符号为1,则右移n位时,高n1,否则全0。 例子:%x 0x80000000 rsha 8 = 0xff800000 (32版本) %x 0x70000000 rsha 4 = 0x70000000 (32版本) %x 0x8000000000000000 rsha 8 = 0xff80000000000000 (64版本) %x 0x7000000000000000 rsha 4 = 0x700000000000000 (64版本) 6-二进制运算函数 (1)读二进函数 rb 格式:rb(data, start, length) 功能:对整型值data,从低的start开始(数从0开始计),连续取出其高的length的值,返回该值。 例子:%b rb(0b1010 0101, 4, 2) = 0b10 (2)写二进函数 wb 格式:wb(data, start, length, value) 功能:对整型值data,将其中start开始(数从0开始计)、其后连续的的length的值改写为value,返回修改后的data值。 例子:%b wb(0b1010 0000, 4, 4, 0b1111) = 0b1111 0000 (3)指定置1函数 setb 格式:setb(data, start, length) 功能:对整型值data,从低的start开始(数从0开始计),其后连续的length全部置1,返回修改后的data值。 例子:%x setb(0x0, 8, 16) = 0x00ffff00 (4)指定清0函数 rstb 格式:rstb(data, start, length) 功能:对整型值data,从低的start开始(数从0开始计),其后连续的length全部置0,返回修改后的data值。 例子:%x rstb(0xffffffff, 8, 16) = 0xff0000ff (5)指定反转函数 rvsb 格式:rvsb(data, start, length) 功能:对整型值data,从低的start开始(数从0开始计),其后连续的length全部反转,返回修改后的data值。 例子:%x rvsb(0x0, 8, 16) = 0x00ffff00 七 逻辑运算 支持6种关系运算,和3种逻辑运算,以及C/C++条件运算。 当逻辑结果为真时,结果为整型值1;当逻辑结果为假时,结果为整型值0。 1-关系运算 (1)大于 > 1+2 > 3+4 = (1+2) > (3+4) = 0 (2)大于等于 >= 3.14*2 >= 6.28 = 1 (3)小于 < 1+2 < 3+4 = (1+2) < (3+4) = 1 (4)小于等于 <= 3.14*2 <= 6.28 = 1 (5)等于 == 3.14*2 == 6.28 = 1 (6)不等于 != 3.14*2 != 6.28 = 0 2-逻辑运算 (1)逻辑与 && 1<2 && 3<5 = (1<2) && (3<5) = 1 1<2 && 32 || 3>3 = 0 1>2 || 3>=3 = 1 (3)逻辑非 ! !0 = 1 !1 = 0 !(-3.14) = 0 3-条件运算 ? : 格式:表达式1 ? 表达式2 : 表达式3 结果:当表达式1为真时,整个表达式的结果等于表达式2,否则结果等于表达式3。 例子:1+2>3+4 ? 1+2 : 3+4 = 7 sqr(1+2<3+4 ? 1+2 : 3+4) = sqr(1+2) = 1.73205 4-逻辑结果值 逻辑结果值(0或1)又可作为整数参与其它运算。 (-3<5) + 2 = 1 + 2 = 3 1<2<3 = (1<2)<3 = 0e ? pi : e (得到常量pi和e中的大者) myave = ave(65, 78, 84.5, 96) (求几个数的平均值,myave = 80.875) 对已定义的变量可以再次赋值,这时原值丢失,保存新值。 引用未定义的变量时会报错。 2-赋值表达式 赋值运算本又是个表达式,即赋值表达式。 整个赋值表达式的值,为=号右部表达式的值,例如 a = (b = 5) (此时变量a和b的值都等于5) 采用此法可以一次性定义多个变量。 3-内置的常量 以下内置常量可以直接使用,常量名不区分大小写。 不能对常量重新赋值,否则会报错。 e = 2.718281828459 (自然对数的底) gold = 0.61803398874989484820 (黄金分割比率) inch = 2.54 (1英寸等于几厘米) kv = 273.15 (开氏温度 = 摄氏温度 + 273.15) nmi = 1.852 (1海里等于几公里) pi = 3.1415926535898 (圆周率) 十二 运算符的优先级 1-优先级顺序 运算符按优先级划分为如下14组,各个组的优先级由高到低,同一组内的优先级相同。 不清楚优先级时,请用使用括号。 (1) -(取负) !(逻辑非) ~(取反) %(百分比) %%(万分比) !(阶乘) K M G T P E(存储单后缀) w y wy yy wyy yyy kilo mil bil tril(数量后缀) id(arg1, arg2, ...)(函数调用) (2) abs ceil floor lg ln log exp sqr rtd dtr sin cos tan ctan asin acos atan sinh cosh tanh intcm cmtin nmtkm kmtnm lbtkg kgtlb ftc ctf ktc ctk (3) * / mod(求余) **(幂运算) (4) + - (5) <> rshl rsha rol ror (6) > >= < <= (7) == != (8) & (按与) (9) ^ (按异或) (10) | (按或) (11) && (逻辑与) (12) || (逻辑或) (13) ?: (条件运算) :=:? (等比运算) (14) = (赋值运算) 2-用括号指定运算顺序 1 + 2 * 3 = 1 + (2 * 3) = 7 (1 + 2) * 3 = 9 1 * (2 + 3) = 5 author: huyansoft
二进制图文详解 二进制Binary 2进制 逢二进一的计数规则。 在计算机内部,一切数据都是2进制的!! 2进制的数字 补码 补码本质是一种解决负数问题的算法。 1. 将数据的一半当做负数使用。 2. 补码在内存中是2进制的,显示的时候为10进制。 - Java利用算法支持了补码计算: - Integer.parseInt() - Integer.toString() 3. 补码的缺点: - 不支持超范围计算 - 超范围计算自动溢出 4. 解决补码的缺点:采用更大范围(更多数)的补码 Java是如何计算 -2-1 的 补码的规律 1. 最大值的规律:最高0 剩下全是1 - int类型:一个0,31个1 - long类型:一个0,63个1 2. 最小值的规律:最高1 剩下全是0 - int类型:一个1,31个0 - long类型:一个1,63个0 3. 负数的最高是1, 正数最高是0 - 最高做为识别正数和负数的标志:称为符号 - 注意:符号不是用来表示正负号的!!! 4. -1 的规律:所有都是1!! 5. 溢出是有规律的! 是一个周期性计算结果。 - 最大值+1 = 最小值 6. 补码的对称现象:-n = ~n + 1 案例: int max = Integer.MAX_VALUE; System.out.println(Integer.toBinaryString(max)); int min = Integer.MIN_VALUE; System.out.println(Integer.toBinaryString(min)); long lmax = Long.MAX_VALUE; System.out.println(Long.toBinaryString(lmax)); long lmin = Long.MIN_VALUE; System.out.println(Long.toBinaryString(lmin)); //-1的规律 int n = -1; System.out.println(Integer.toBinaryString(n)); long l = -1L; System.out.println(Long.toBinaryString(l)); //最大值+1溢出得到最小值 // 推论:Java中的int数字是按照补码圆环排列的 int m = Integer.MAX_VALUE+1; System.out.println(m);//最小值 //一个数的溢出测试: n = 345; m = n + Integer.MAX_VALUE+1; System.out.println(m);//负数 m = n + Integer.MAX_VALUE+1+ Integer.MAX_VALUE; System.out.println(m);//344 正数 m = n - (Integer.MAX_VALUE+1+ Integer.MAX_VALUE+1); System.out.println(m);//345 正数 经典面试题1 正数的溢出结果是负数(错误!!!) 经典面试题2 int i = Integer.MAX_VALUE+1; System.out.println( Integer.toBinaryString(i)); 选择运行结果(D): A. 11111111111111111111111111111111 B. 1111111111111111111111111111111 C. 01111111111111111111111111111111 D. 10000000000000000000000000000000 经典面试题3 System.out.println(~-55); 如上代码的运算结果: ( 54 ) System.out.println(~-230); 如上代码的运算结果: ( 229 ) System.out.println(~55); 如上代码的运算结果: ( -56 ) 16进制 16进制是2进制的简写形式 2进制运算 1. ~ 取反运算 2. & 与运算(逻辑乘法) 运算规则: 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 与运算用途: n: 00010100 11010111 01010001 11101010 m: 00000000 00000000 00000000 11111111

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少喝点花露水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值