记录一下java中的 & | ^ ~ << >> >>>的基本使用

/**
 * 符号转换操作 主要针对
 * & 逻辑与
 * | 逻辑或
 * ^ 逻辑异或
 * ~ 取反
 * << 有符号左移
 * >> 有符号右移
 * >>> 无符号右移
 *
 * @Author: xiaofeifei
 * @Date: 2021/1/22 10:32
 */
public class SymbolTransferDemo {

    public static void main(String[] args) {
        int a = 1;
        int b = 3;
        int d = -2;
        // 1. 逻辑与
        logicAnd(a, b, d);
        // 2. 逻辑或
        logicOr(a, b, d);
        // 3. 逻辑异或
        logicXOR(a, b, d);
        // 4. 取反
        logicNegate(a, b, d);
        // 5. 有符号左移
        symbolShiftLeft(a, b, d);
        // 6. 有符号右移
        symbolShiftRight(a, b, d);
        // 7. 无符号右移
        noSymbolShiftRight(a, b, d);

    }

    private static void noSymbolShiftRight(int a, int b, int d) {
    // 无符号右移 高位补0
        int c;
        c = a >>> 2;
        // a的补码:   0000 0000 0000 0000 0000 0000 0000 0001
        //a无符号右移:0000 0000 0000 0000 0000 0000 0000 0000 => 0
        System.out.println("正数无符号右移2位 = " + c);
        d = -4;
        c = d >>> 2;
        // 负数的无符号右移 高位补0
        // d的补码:      1111 1111 1111 1111 1111 1111 1111 1100
        // d有符号右移:  0011 1111 1111 1111 1111 1111 1111 1111 => 为正数 1073741823
        System.out.println("负数无符号右移2位 = " + c);
    }

    private static void symbolShiftRight(int a, int b, int d) {
        // 有符号右移 如果为正数 则高位补0 如果为负数 则高位补1
        int c;
        c = a >> 2;
        // a的补码:   0000 0000 0000 0000 0000 0000 0000 0001
        //a有符号右移:0000 0000 0000 0000 0000 0000 0000 0000 => 0 最高位正数补0 负数补1
        System.out.println("正数有符号右移2位 = " + c);
        d = -4;
        c = d >> 2;
        // 负数的有符号右移 高位补1
        // d的补码:      1111 1111 1111 1111 1111 1111 1111 1100
        // d有符号右移:  1111 1111 1111 1111 1111 1111 1111 1111 => 为负数 => 最高位正数补0 负数补1
        // d结果为:      1000 0000 0000 0000 0000 0000 0000 0001 => -1
        System.out.println("负数有符号右移2位 = " + c);
    }

    private static void symbolShiftLeft(int a, int b, int d) {
        int c;
        c = a << 2;
        // a的补码:   0000 0000 0000 0000 0000 0000 0000 0001
        //a有符号左移:0000 0000 0000 0000 0000 0000 0000 0100 => 4 最高位正数补0 负数补1
        System.out.println("正数有符号左移2位 = " + c);
        c = d << 2;
        // d的补码: 1111 1111 1111 1111 1111 1111 1111 1110
        // d左移:  1111 1111 1111 1111 1111 1111 1111 1000 => 为负数 => 最高位正数补0 负数补1
        //         1000 0000 0000 0000 0000 0000 0000 1000 => -8
        System.out.println("负数有符号左移2位 = " + c);
    }

    private static void logicNegate(int a, int b, int d) {
        int c;
        c = ~a;
        // a的补码: 0000 0000 0000 0000 0000 0000 0000 0001
        // 取反:   1111 1111 1111 1111 1111 1111 1111 1110 => 为负数 转化为原码
        //         1000 0000 0000 0000 0000 0000 0000 0010 => -2
        System.out.println("正数取反 = " + c);
        c = ~d;
        // d的补码: 1111 1111 1111 1111 1111 1111 1111 1110
        // ~取反:  0000 0000 0000 0000 0000 0000 0000 0001 => 为正数 结果为1
        System.out.println("负数取反 = " + c);
    }

    private static void logicXOR(int a, int b, int d) {
        int c;
        c = a ^ b;
        // a => 0000 0001
        // b => 0000 0011
        // c => a ^ b => 0000 0010 => 2
        System.out.println("逻辑异或 = " + c);
        // 负数测试
        c = b ^ d;
        // 负数是以补码的形式参与计算机计算
        // d => 1000 0000 0000 0000 0000 0000 0000 0010 取反 + 1为:
        //  1111 1111 1111 1111 1111 1111 1111 1110
        //  0000 0000 0000 0000 0000 0000 0000 0011
        //^ 1111 1111 1111 1111 1111 1111 1111 1101 => 结果为负 转换为原码
        //  1000 0000 0000 0000 0000 0000 0000 0011 => -3
        System.out.println("负数和正数逻辑异或 = " + c);
        // 全负数测试
        int e = -4;
        c = e ^ d;
        // d补码: 1111 1111 1111 1111 1111 1111 1111 1110
        // e补码: 1111 1111 1111 1111 1111 1111 1111 1100
        // 进行^: 0000 0000 0000 0000 0000 0000 0000 0010 => 结果为正数 原码就是补码 2
        System.out.println("负数和负数逻辑异或 = " + c);
    }

    private static void logicOr(int a, int b, int d) {
        // 2. 逻辑或
        int c;
        c = a | b;
        // a => 0000 0001
        // b => 0000 0011
        // c => a & b => 0000 00011 => 3
        System.out.println("逻辑或 = " + c);
        // 负数测试
        c = b | d;
        // 因为负数计算机是以补码的形式保存 -2是原码(展示为这个数据) 因此我们需要先转换成补码参与计算 d => -2取反 + 1 真实的计算中也是以补码的形式进行计算
        // d => 1000 0000 0000 0000 0000 0000 0000 0010 取反 + 1为:
        //  1111 1111 1111 1111 1111 1111 1111 1110
        //  0000 0000 0000 0000 0000 0000 0000 0011
        //| 1111 1111 1111 1111 1111 1111 1111 1111 => 因为最高位为1,所以结果为负数,这个结果为补码 我们需要转换成我们所理解的原码
        // 原码 = (补码 - 1)取反=> 1111 1111 1111 1111 1111 1111 1111 1110
        // 取反 => 1000 0000 0000 0000 0000 0000 0000 0001 => -1
        System.out.println("负数和正数逻辑或 = " + c);
    }

    private static void logicAnd(int a, int b, int d) {
        // 1. 逻辑与
        // a => 0000 0001
        // b => 0000 0011
        // c => a & b => 0000 0001 => 1
        int c = a & b;
        System.out.println("逻辑与 = " + c);
        // 负数测试
        c = b & d;
        // 因为负数是以补码的形式保存 d => -2取反 + 1
        // d => 1000 0000 0000 0000 0000 0000 0000 0010 取反 + 1为:
        //  1111 1111 1111 1111 1111 1111 1111 1110
        //  0000 0000 0000 0000 0000 0000 0000 0011
        //& 0000 0000 0000 0000 0000 0000 0000 0010 => 2
        System.out.println("负数和正数逻辑与 = " + c);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想使用`JPAQuery<>()`对象来查询并返回`List<Map<String, Object>>`,可以按照以下步骤进行: 1. 首先,你需要定义一个实体类来映射数据库表。假设你的表名为“person”,你可以创建一个Person类来映射它: ```java @Entity @Table(name = "person") public class Person { @Id private Long id; private String name; private Integer age; // 省略getter和setter方法 } ``` 2. 接下来,你需要使用QueryDSL的API来构建查询。查询的结果将被映射为一个`List<Map<String, Object>>`,其每个Map表示一行记录,key为字段名,value为字段值。 ```java QPerson person = QPerson.person; JPAQuery<?> query = new JPAQuery<Void>(entityManager); List<Map<String, Object>> result = query .select( Projections.map(person.id, person.name, person.age) ) .from(person) .fetch() .stream() .map(row -> row.get(0, Map.class)) .collect(Collectors.toList()); ``` 在上面的代码,我们首先使用QPerson类来表示“person”表,然后使用JPAQuery构建查询。在select()方法,我们使用Projections.map()方法来指定要查询的字段,并将它们映射为一个Map。在from()方法,我们指定要查询的表。最后,我们使用fetch()方法执行查询,并将结果映射为`List<Map<String, Object>>`。 在使用Projections.map()方法时,需要注意的是,它只能映射基本类型、字符串、日期等简单类型。如果要映射实体类或其他复杂类型,可以使用Projections.bean()方法或自定义转换器。 希望这可以帮助你使用QueryDSL和JPA查询并返回`List<Map<String, Object>>`。如果你还有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值