java~"与运算"实现保留一个数的低8位

Posted 敢于对过去告一个段落,才有信心掀开新的篇章!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java~"与运算"实现保留一个数的低8位相关的知识,希望对你有一定的参考价值。

int类型另外介绍

  • int类型的封装类型是Integer类型,它是有符号的类型,即它有负数和正数两部分,最小为-232,最大值是232-1。
  • int类型由32位二进制数组成,每4位二进制数表示为1位16进制数,每8位2进制数占用存储空间为1字节、即每2位16进制也占用1字节
  • 一个int类型的数字,占用32/8=4,占用的存储空间为4个字节
  • 对一个数字n与0xff做与运算,相当于将n的二进制表示的低8位保留下来,并将高24位清零。
  • 0xff(十进制为255)的二进制表示为11111111,它是一个8位二进制数,与任何一个整数做与运算都只能得到这个整数的低8位(即最右边的8位),其余位都会被清零

与运算例子

  • 与运算在计算时,先把10进制转成2进制,再把两个2进制进行与运算,位数不够,在左面补0,两个数位置的数全1则1,有0则0、例如:1&1=1、1&0=0,0&0=0 。
  • 例如,数字128的二进制表示为10000000,如果对它执行128 & 0xff,结果为0x80,与128的二进制表示10000000保留的是最右边的8位,而其余位置0,因此返回的值为0x80。
  • 再比如,数字256的二进制表示为100000000,如果对它执行256 & 0xff,结果为0,与256的二进制表示100000000保留的是最右边的8位,而其余位置0,因此返回的值为0。
  • 这个操作在进行位运算和字节数组处理时经常使用,尤其是在处理有符号和无符号整数的补码表示时,有助于保留整数的正确值。

DataOutputStream中对它的使用

  • & 0xFF 低8位保留,高24位清零
  • 无符号的右移,>>>8表示右移8位,即相当于除以2^8次方

   public final void writeShort(int v) throws IOException 
        out.write((v >>> 8) & 0xFF);
        out.write((v >>> 0) & 0xFF);
        incCount(2);
    

Java中的"goto"实现

Java中的"goto"实现
出处:https://blog.51cto.com/lavasoft/178997
 
Java语言中goto是保留关键字,没有goto语句,也没有任何使用goto关键字的地方。
 
Java中也可在特定情况下,通过特定的手段,来实现goto的功能。显然Java不愿意开发者随意跳转程序。下面解释两个特定:
特定情况:只有在循环体内,比如for、while语句(含do...while语句)中。
特定手段:语句标签和循环控制关键字break、continue,语法格式是:break/continue 语句标签。
 
一、break、continue和语句标签
 
1、语句标签
语句标签的语法是:标签名:
语句标签可以定义在方法体内的最后一条语句之前即可。但是语句标签实际使用的机会是与break和continue结合使用的,而break和continue是和循环语句结合使用的,因此实际上语句标签的使用也是和循环紧密结合的。
 
语句标签在被使用的情况,只能定义在循环迭代语句之前,否则编译出错!
 
因此,有意义、可使用的标签含义是:指定循环语句的标识!
 
2、break、continue语句单独使用
单独使用情况下:break语句作用是结束当前的循环迭代体,进而执行剩余的语句。
continue语句的作用是结束本次迭代过程,继续执行下一轮迭代。
 
3、break、continue语句结合语句标签的使用
为什么需要语句标签呢?
原因是因为程序可能有循环的嵌套,当多层循环嵌套时候,有时候需要一次跳出多级循环,这种情况下就需要结合语句标签才能实现此功能了。
 
带标签使用情况下:break中断并跳出标签所指定循环,continue跳转到标签指定的循环处,并继续执行该标签所指定的循环。
 
为了说明情况,看看下面的例子:
import java.util.Random;

/**
* 语句标签测试
*
* @author leizhimin 2009-7-16 11:43:08
*/

public class TestLable {
        public static void main(String[] args) {
                outer:
                for (int i = 0; i < 10; i++) {
                        System.out.println("\\nouter_loop:" + i);
                        inner:
                        for (int k = 0; i < 10; k++) {
                                System.out.print(k + " ");
                                int x = new Random().nextInt(10);
                                if (x > 7) {
                                        System.out.print(" >>x == " + x + ",结束inner循环,继续迭代执行outer循环了!");
                                        continue outer;
                                }
                                if (x == 1) {
                                        System.out.print(" >>x == 1,跳出并结束整个outer和inner循环!");
                                        break outer;
                                }
                        }
                }
                System.out.println("------>>>所有循环执行完毕!");
        }
}
 
执行结果:

outer_loop:0
0 1 2 3 4 5 6 7 8 9    >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:1
0 1 2 3 4 5    >>x == 9,结束inner循环,继续迭代执行outer循环了!
outer_loop:2
0 1 2 3 4 5 6 7 8 9    >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:3
0 1 2 3 4    >>x == 9,结束inner循环,继续迭代执行outer循环了!
outer_loop:4
0 1 2 3 4 5 6 7 8 9 10    >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:5
0    >>x == 1,跳出并结束整个outer和inner循环!------>>>所有循环执行完毕!

Process finished with exit code 0
 
这个执行结果是随机的。
 
下面给个图看看:

 

 

 
二、switch语句
 
switch语句是一个条件选择语句,这个语句有“goto”的味道,但是限制也很多,因此,实际中使用较少。
 
switch语句的结构如下:
switch(intvar){
        case intval: 语句代码;break;
        case intval: 语句代码;break;
        case intval: 语句代码;break;
        case intval: 语句代码;break;
        default:
                 语句代码;
}
 
switch(intval){...}语句中,小括号中intvar是一个整数条件因子变量,这个变量只能为:byte、char、short、int和enum(枚举类型)几种类型,本质上都是×××数字。intval是匹配的条件因子值,当匹配时,执行其下的语句。其中所有的break语句都是可选的。当执行了break语句后,就跳出整个switch语句,否则,还会继续往下匹配别的条件。当intvar不能匹配所有的给定条件值时候,就执行default语句,如果没有default语句,则跳出switch语句。
 
switch语句的条件因子变量只能作为整型数字或者字符型、枚举类型,这个限制太严格了,使得switch语句的实际用途不是很大。
 
下面是一个汉语金额数字转换程序:
/**
* 汉语金额数字转换程序
*
* @author leizhimin 2009-7-16 13:28:05
*/

public class TestSwitch {

        /**
         * 数字转换为汉语金额数字
         *
         * @param num 数字
         * @return 汉语金额数字
         */

        public static String genCnNum(Long num) {
                StringBuffer sb = new StringBuffer();
                String snum = String.valueOf(num);
                for (char c : snum.toCharArray()) {
                        sb.append(num2Cn(c));
                }
                return sb.toString();
        }

        /**
         * 字符数字转换为汉语金额数字
         *
         * @param c 字符数字
         * @return 汉语金额数字
         */

        private static String num2Cn(char c) {
                String res = null;
                switch (c) {
                        case \'0\':
                                res = "零";
                                break;
                        case \'1\':
                                res = "壹";
                                break;
                        case \'2\':
                                res = "貮";
                                break;
                        case \'3\':
                                res = "叁";
                                break;
                        case \'4\':
                                res = "肆";
                                break;
                        case \'5\':
                                res = "伍";
                                break;
                        case \'6\':
                                res = "陆";
                                break;
                        case \'7\':
                                res = "柒";
                                break;
                        case \'8\':
                                res = "捌";
                                break;
                        case \'9\':
                                res = "玖";
                                break;
                        default:
                                System.out.println("您的输入有误,请重试!");
                }
                return res;
        }

        public static void main(String[] args) {
                System.out.println(genCnNum(4523586022L));
        }
}
 
运行结果:
肆伍貮叁伍捌陆零貮貮

Process finished with exit code 0

以上是关于java~"与运算"实现保留一个数的低8位的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何实现在运算过程中的四舍五入保留两位小数

java.lang.Number 没有实现“+”或任何其他运算符?

JS运算结果取小数点后3位

java编程如何保留两位小数

java, map,如何实现当读入的key发生重复时,只保留重复key的第一行?

JS 文本框加法运算保留2位小数